【发布时间】:2019-07-23 08:01:04
【问题描述】:
我的网站 (Spring MVC) 允许用户使用他们的 Facebook 帐户注册,并在以后使用他们的 Facebook 帐户登录我的网站。我使用 scribejava (version 6.6.3) (https://github.com/scribejava/scribejava) 与 Facebook 进行 Oauth 集成。
我已经测试了一个用例,但无法找到解决方法。以下是步骤列表:
- 测试人员进入我网站的“登录”页面,单击“使用 Facebook 登录”,在 Facebook 授予权限,被重定向到我的网站,然后退出。这是正常且成功的流程。
- 测试人员在 Facebook.com 上登录 Facebook
- 测试人员转到设置->应用和网站并删除我的网站
- 测试人员转到我网站的“登录”页面,单击“使用 Facebook 登录”按钮,被重定向到 Facebook,并看到一条错误消息。
在第 4 步,测试人员总是在 Facebook 网站上收到错误消息,而不是要求测试人员再次授予权限。请看以下截图:
单击“使用 Facebook 登录”按钮时,我无法在 Facebook 上找到删除此消息的方法。这是我的 Web 界面代码。我错过了什么吗?
@RequestMapping( value="/facebook", method = RequestMethod.GET)
public void facebook(HttpServletRequest request,
@RequestParam(value = "page", required = true) String page,
HttpServletResponse response) throws Exception {
try {
OAuth20Service service = new ServiceBuilder(config.getProperty("facebook.clientId"))
.apiSecret(config.getProperty("facebook.clientSecret"))
.callback(getCallback())
.build(FacebookApi.instance());
String authUrl = service.getAuthorizationUrl();
response.sendRedirect(authUrl);
} catch (Exception e) {
response.sendRedirect("/oauthFail");
}
}
@RequestMapping( value="/facebook/callback", method = RequestMethod.GET)
public void facebookCallback(HttpServletRequest servletRequest,
@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "error", required = false) String error,
HttpServletResponse servletResponse
) throws Exception {
try {
OAuth20Service service = new ServiceBuilder(config.getProperty("facebook.clientId"))
.apiSecret(config.getProperty("facebook.clientSecret"))
.callback(getCallback())
.build(FacebookApi.instance());
OAuth2AccessToken accessToken = service.getAccessToken(code);
final OAuthRequest request = new OAuthRequest(Verb.GET, "https://graph.facebook.com/v3.2/me");
service.signRequest(accessToken, request);
final com.github.scribejava.core.model.Response response = service.execute(request);
String body = response.getBody();
JSONObject jObject = new JSONObject(body);
String email = jObject.getString("email");
//success. use the email to create an account or if the email address exists, direct a userto their account page
} catch (Exception e) {
response.sendRedirect("/oauthFail");
}
}
如何处理这种情况?我觉得要么是我的代码出了问题,要么是 scribejava 有框架问题。或者这是 Facebook 特有的问题?
【问题讨论】:
标签: facebook-graph-api oauth oauth-2.0 facebook-oauth scribe