【发布时间】:2015-06-20 13:17:49
【问题描述】:
我正在尝试在我们的应用程序中为 java 中的 facebook 构建身份验证流程。我正在使用 facebook4j 库。
我的对应代码如下-
public String authenticate() throws IOException {
Facebook facebook = new FacebookFactory().getInstance();
String redirectURL = facebook.getOAuthAuthorizationURL("http://localhost:9099/default/facebook/verify.html");
servletResponse.sendRedirect(redirectURL);
return null;
}
public String verify() throws Exception {
String code = servletRequest.getParameter("code");
Facebook facebook = new FacebookFactory().getInstance();
AccessToken accessToken = facebook.getOAuthAccessToken(code);
String token = accessToken.getToken();
servletResponse.getWriter().write(token);
return null;
}
在此行重定向后出现错误 -
AccessToken accessToken = facebook.getOAuthAccessToken(code);
报错如下-
FacebookException{statusCode=400, errorType='OAuthException', errorMessage='redirect_uri isn't an absolute URI. Check RFC 3986.', errorCode=191, errorSubcode=-1, version=2.2.2}
at facebook4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:179)
at facebook4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65)
at facebook4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:97)
at facebook4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:107)
我在第一次通话时从 facebook 获得的重定向 URL 是 -
也尝试过不使用编码 -
它正确地重定向到“验证”具有类似的 url -
facebook4j.properties
oauth.appId=416XXXXXXXXX389
oauth.appSecret=9ed3XXXXXXb6acXXXXXXXXc7acXXXX5
oauth.permissions=email,public_profile,user_friends
我的 Facebook 应用程序基本设置是 -
重要的高级设置是 -
我完全知道类似的问题已在早些时候多次发布。我已经解决了几乎所有问题,并且尝试了几乎所有建议来解决此问题。但由于某种原因,它无法正常工作。在同一问题上花了 3 天后,我决定在这里发布我的问题。
如果有人指出我到底哪里错了,我将不胜感激。
【问题讨论】:
-
redirect_uri参数在将code交换为令牌时也必须指定(并且必须与之前在登录对话框调用中指定的相同)。我假设由于您在第二种方法中使用new FacebookFactory().getInstance(),因此情况并非如此。看看这里的基本实现,github.com/roundrop/facebook4j-oauth-example/tree/master/src/…——在SignInServlet中,Facebook对象实例被存储到会话中,然后在CallbackServlet中,同样的实例被检索并再次使用。 -
是的,这正是问题所在。我使用了 2 个 facebook4j.Facebook 实例,第二次我没有设置 redirect_uri。如果您将评论添加为答案,我认为这对其他人会有所帮助。谢谢。
标签: java facebook facebook-graph-api redirect oauth