Facebook OAuth redirect_uri问题

时间:2015-04-14 19:17:51

标签: java facebook facebook-graph-api redirect oauth

我正在尝试在我们的应用程序中为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收到的redirectURL是 -

  

https://www.facebook.com/dialog/oauth?client_id=4161XXXXXX6389&redirect_uri=http%3A%2F%2Flocalhost%3A9099%2Fdefault%2Ffacebook%2Fverify.html&scope=email,public_profile,user_friends

尝试不使用编码 -

  

https://www.facebook.com/dialog/oauth?client_id=4161XXXXXX6389&redirect_uri=http://localhost:9099/default/facebook/verify.html&scope=email,public_profile,user_friends

它正确地重定向到“验证”,其网址类似于 -

  

http://localhost:9099/default/facebook/verify.html?code=AQCE4aaIpE_c94J3NVNjge_YL_OP84vPIgUauvfRRXNCj_FOK8U2kfSxfKGrjWnFL1dqMeM8q22M6UaVbGsTpTQOQmjxYILdFHKFiSFd0Ycf_ByBE9rNX_yxvFnJ3RNLf7bjCT4C1uXuuqCXHZjVNN1lBb3LWUHz7eNkq0r8K14x7ZEVIWjbll-Vqys1FZuCIVDBrI4StoYkZR1rpCsoSqq7VdCIX3zawnw_nbPZBZU7iUeZJiBbahYjWkHIn47b9AQb3hZxxpe4xxXHXfDsP_h2fhC1YYioJbwGq4QbnWpUrP7aF-0Q_wF71zn4txCQLd4#=

facebook4j.properties

oauth.appId=416XXXXXXXXX389
oauth.appSecret=9ed3XXXXXXb6acXXXXXXXXc7acXXXX5
oauth.permissions=email,public_profile,user_friends

我的Facebook App基本设置是 -

enter image description here

重要的高级设置是 -

enter image description here

我完全清楚类似的问题已多次发布。我几乎经历过每一个问题。我尝试了几乎所有建议来解决这个问题。但由于某种原因,它不起作用。我决定在同一个问题上花3天后在这里发布我的问题。

如果有人指出我哪里错了,我将非常感激。

1 个答案:

答案 0 :(得分:1)

在交换令牌代码时也必须指定redirect_uri参数(并且必须与登录对话框调用中先前指定的相同)。

我假设你在第二种方法中使用new FacebookFactory().getInstance(),情况并非如此。看看这里的基本实现https://github.com/roundrop/facebook4j-oauth-example/tree/master/src/main/java/facebook4j/examples/signin

SignInServlet中,Facebook对象实例存储在会话中,然后在CallbackServlet中检索并再次使用相同的实例。因此,它仍保留调用Auth对话框时最初使用的redirect_uri值,并在为代币交换code时重复使用相同的值。