2012-12-19 74 views
4

我試圖做服務器端身份驗證與臉譜,我可以登錄對話框和權限,但重定向後,我沒有得到身份驗證代碼在重定向處理程序。任何建議?facebook登錄服務器端使用golang不工作

FBCfg = &oauth.Config { //setup 
    ClientId: appId, ClientSecret: appSecret, 
    AuthURL: "https://www.facebook.com/dialog/oauth", 
    TokenURL: "https://graph.facebook.com/oauth/access_token", 
    RedirectURL: "http://"+domain+"/fedlogin/facebook/redir", 
    Scope: "", 
} 

func FBHandleAuth(w http.ResponseWriter, r *http.Request) { 
    url := FBCfg.AuthCodeURL("") 
    http.Redirect(w, r, url, http.StatusFound) 
} 

func FBHandleRedir(w http.ResponseWriter, r *http.Request) { 
    code := r.FormValue("code") 
    w.Write([]byte(code)) //<-- empty, no code returned. 
} 

編輯:我正在使用原來的goauth2最新版本。

回答

5

我一直在這方面花費一些時間。我不知道我的recent rather silly question中的樣本是否對您有用,但爲了以防萬一。

你會注意到我的不使用goauth2。您可能會也可能不會意識到,「股票」goauth2在Facebook的OAuth2實現方面效果不佳(我相信這是草案20而不是當前的標準)。相反,您可以使用this fork of goauth2,它允許Facebook使用URL查詢字符串格式在一些地方而不是JSON。

不幸的是,如果您使用的是App Engine,還有另一個問題:您不能使用任何依賴於DefaultClient的應用程序,因爲App Engine要求您使用their urlfetch service創建客戶端。我不清楚您是否正在爲App Engine撰寫文章,以免對您造成問題。

你應該檢查一下,看看你是否得到任何返回的查詢字符串。如果您手動測試,會發生什麼情況,例如https://graph.facebook.com/oauth/authorize?client_id=123456789&redirect_uri=http://youruri/&state=somestate?你會得到一個代碼響應?這將幫助你拿起任何錯誤,這是在查詢字符串格式返回,所以你可能不會注意到他們......他們會作爲一個JSON響應:

{ 
    "error": { 
     "message": "Error validating application. Invalid application ID.", 
     "type": "OAuthException", 
     "code": 101 
    } 
} 

因此,在總結:

  1. 請確保您不期待vanilla goauth2處理Facebook OAuth2響應,因爲它尚未(尚未)。
  2. 如果您正在使用App Engine,請通過urlfetch.Client()創建任何http客戶端。
  3. 嘗試您的驗證請求以外的代碼。
  4. 作爲事後的考慮,請確保您的處理程序通過檢查r.URL中的內容來接收包括查詢字符串在內的整個URL。

編輯:12月16日的,我錯了點1:goauth2一直updated to handle Facebook

+0

感謝豐富,問題解決了。你可以在這裏查看https://groups.google.com/forum/?fromgroups#!topic/golang-nuts/Bx4JYq_26Rk – Anonymouse

2

goauth2

//  // The user will be redirected back to this handler, that takes the 
//  // "code" query parameter and Exchanges it for an access token. 
//  func handler(w http.ResponseWriter, r *http.Request) { 
//    t := &oauth.Transport{Config: config} 
//    t.Exchange(r.FormValue("code")) 
//  // The Transport now has a valid Token. Create an *http.Client 
//  // with which we can make authenticated API requests. 
//  c := t.Client() 

所以,如果你有

t := &oauth.Transport{Config: config} 
t.Exchange(r.FormValue("code")) 
c := t.Client() 

更換

code := r.FormValue("code") 

您將有一個驗證的HTTP客戶端。

+1

如果在查詢字符串中完全不存在代碼參數,那麼問題就暗示了這一點。 –

+0

正如Rich所說 – Anonymouse

相關問題