我正在尝试使用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最新版本。
答案 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
}
}
总结如下:
编辑:截至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客户端。