Facebook OAuth redirect_uri 问题
Facebook OAuth redirect_uri Issue
我正在尝试在 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 是 -
也尝试过不使用编码 -
它正确地重定向到 'verify' 有 url 类似 -
facebook4j.properties
oauth.appId=416XXXXXXXXX389
oauth.appSecret=9ed3XXXXXXb6acXXXXXXXXc7acXXXX5
oauth.permissions=email,public_profile,user_friends
我的Facebook App基本设置是-
重要的高级设置是-
我完全知道类似的问题已经 post 早些时候多次编辑过。我已经解决了几乎每一个问题,并且我尝试了几乎所有建议来解决这个问题。但由于某种原因它不工作。在同一问题上花了 3 天后,我决定 post 在这里解决我的问题。
如果有人指出我到底哪里出错了,我将不胜感激。
在交换令牌代码时也必须指定 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
交换为令牌时将重新使用相同的值。
我正在尝试在 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 是 -
也尝试过不使用编码 -
它正确地重定向到 'verify' 有 url 类似 -
facebook4j.properties
oauth.appId=416XXXXXXXXX389
oauth.appSecret=9ed3XXXXXXb6acXXXXXXXXc7acXXXX5
oauth.permissions=email,public_profile,user_friends
我的Facebook App基本设置是-
重要的高级设置是-
我完全知道类似的问题已经 post 早些时候多次编辑过。我已经解决了几乎每一个问题,并且我尝试了几乎所有建议来解决这个问题。但由于某种原因它不工作。在同一问题上花了 3 天后,我决定 post 在这里解决我的问题。
如果有人指出我到底哪里出错了,我将不胜感激。
在交换令牌代码时也必须指定 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
交换为令牌时将重新使用相同的值。