facebook登录服务器端使用golang无法正常工作

时间:2012-12-19 11:04:36

标签: facebook go

我正在尝试使用facebook进行服务器端身份验证,我可以获得登录对话框和权限,但重定向后我没有在重定向处理程序中获得auth'代码'。有什么建议吗?

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最新版本。

2 个答案:

答案 0 :(得分: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. 在您的go代码之外尝试您的身份验证请求。
  4. 作为事后的想法,请确保您的处理程序通过检查r.URL中的内容来接收包含查询字符串的整个URL。
  5. 编辑:截至12月16日我对第1点错误:goauth2已经updated to handle Facebook

答案 1 :(得分: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()

所以如果你替换

code := r.FormValue("code")

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

您将拥有经过身份验证的http客户端。