【问题标题】:No longer working after removing my site from Facebook via "Apps and Websites"通过“应用程序和网站”从 Facebook 删除我的网站后不再工作
【发布时间】:2019-07-23 08:01:04
【问题描述】:

我的网站 (Spring MVC) 允许用户使用他们的 Facebook 帐户注册,并在以后使用他们的 Facebook 帐户登录我的网站。我使用 scribejava (version 6.6.3) (https://github.com/scribejava/scribejava) 与 Facebook 进行 Oauth 集成。

我已经测试了一个用例,但无法找到解决方法。以下是步骤列表:

  1. 测试人员进入我网站的“登录”页面,单击“使用 Facebook 登录”,在 Facebook 授予权限,被重定向到我的网站,然后退出。这是正常且成功的流程。
  2. 测试人员在 Facebook.com 上登录 Facebook
  3. 测试人员转到设置->应用和网站并删除我的网站
  4. 测试人员转到我网站的“登录”页面,单击“使用 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


    【解决方案1】:

    我刚刚测试了这个案例。无法重现。 您是否尝试运行此示例 https://github.com/scribejava/scribejava/blob/master/scribejava-apis/src/test/java/com/github/scribejava/apis/examples/FacebookExample.java ? 我认为您的问题可能与 Facebook 中的 API 版本逻辑有关。 你可以尝试显式使用最新的.build(FacebookApi.customVersion("3.2"))

    【讨论】:

    • 我通过 maven 使用了 scribejava 6.3.0。我在上面的代码中使用了.build(FacebookApi.customVersion("3.2")) 而不是.build(FacebookApi.instance());。现在从我的网站到 Facebook 的网址是 https://www.facebook.com/v3.2/dialog/oauth?redirect_uri=...。我仍然看到相同的错误消息,而不是征求我的许可。上面的代码是我所有的代码。您是否在 Web 界面中测试了确切的用例?
    • 我收到一封来自 Google 的电子邮件,上面写着“Google+ API 将于 2019 年 3 月 7 日关闭”。我的网站与 Google 的注册/登录集成基于此示例:github.com/scribejava/scribejava/blob/master/scribejava-apis/… 此示例使用 googleapis URL。我的选择是什么?
    • 我用过这个例子。 github.com/scribejava/scribejava/blob/master/scribejava-apis/…你也可以试试。你有它;-)
    • 关于 Google 的问题是题外话,不是吗?无论如何,你需要什么选择?
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多