【问题标题】:Facebook client-side authentication - http or https redirect from OAuth dialogFacebook 客户端身份验证 - 来自 OAuth 对话框的 http 或 https 重定向
【发布时间】:2012-06-08 12:41:56
【问题描述】:

我已经阅读了大量的 FB 文档,但仍然无法正常工作。

我有一个在 IFrame 中运行的 FB 应用程序。我正在使用 JS SDK 对用户进行身份验证。所以如果用户之前没有使用过我的应用,我需要提示他们授权。

我尝试使用FB.Login(),但这有两个大问题:

  1. 它会打开一个丑陋的弹出窗口
  2. 我希望自动显示登录屏幕(即无需用户再次单击)

因此,我尝试重定向到客户端上的 OAuth 对话框。为此,必须在顶部窗口中打开 OAuth url,这意味着我需要将 redirect_uri 作为 apps.facebook.com/myapp 传递。

问题是,这只有在我使用 https 作为协议时才有效。但如果用户已经通过 http 使用 facebook,我不想将它们切换到 https。

这是我的代码:

window.fbAsyncInit = function () {
    FB.init({
        appId: 1234567890,
        channelUrl: "//mydomain.com/channel.html",
        status: true,
        cookie: true,
        xfbml: true
    });

    FB.Event.subscribe('auth.statusChange', function (response) {
        console.log(response);
        if (response.status === "connected") {
            // User has authorized app
        } else if (response.status === "not_authorized") {
            var url = "//www.facebook.com/dialog/oauth?";
            var queryParams = ["client_id=1234567890",
                  "redirect_uri=//apps.facebook.com/myapp",  // NOT WORKING
                  "response_type=token"];
            var queryString = queryParams.join("&");
            url += queryString;
            window.top.location = url;
        }
    });
};

有没有办法使用 OAuth 对话框通过客户端流程进行身份验证?还是我完全走错了路?

(P.S.我不想使用服务器端流程,因为根据Facebook C# SDK的v6,推荐的方法是在客户端授权并将access_token从客户端传递给服务器)

【问题讨论】:

  • "redirect_uri=//apps.facebook.com/myapp", // 不工作 - 这是你的主要问题吗?如果是这样,您可以轻松地读取在使用 JS 的 iframe 中请求应用程序 URL 时使用的协议,它位于 location.protocol 属性中。
  • 如何阅读协议?该应用程序位于 IFrame 中,根据定义,它与 Facebook 不在同一个域中。所以同源策略阻止我从顶部窗口读取 url。这正是我所需要的,所以请更详细地解释如何做到这一点。
  • 我写道,“用于在 iframe 内请求 您的应用程序的 URL 的协议”……如果用户通过 HTTPS 浏览 Facebook,那么您的应用程序的 HTTPS 版本将被调用;如果他只使用 HTTP,那么它就是你的应用程序的 HTTP 版本。因此,通过严格的数学逻辑,我们可以从中推断出:App 协议 == Facebook 协议。您阅读了前者,您可以在不违反 SOP 的情况下做到这一点,并且您知道在将用户发送到 Facebook 时使用哪个...不是很简单,一旦您考虑...?
  • (拍脑袋)对不起,应该更仔细地阅读。感谢您在谓词逻辑(和讽刺)方面的课程。你是绝对正确的。如果您发布作为答案,我会接受。感谢您的帮助(和耐心)

标签: facebook authentication facebook-javascript-sdk facebook-oauth


【解决方案1】:

"redirect_uri=//apps.facebook.com/myapp", // NOT WORKING

——这是你的主要问题吗?如果是这样,您可以轻松地读取在使用 JS 的 iframe 内请求应用程序 URL 时使用的协议,它位于 location.protocol 属性中。是的,您的应用使用的协议与用户用于浏览 Facebook 网站的协议相匹配;-)

【讨论】:

    【解决方案2】:

    我建议你不要听“v6 of the Facebook C# SDK”。

    您所描述的您想要执行的操作拼写为“服务器端身份验证流程”。
    您应该做的是实现服务器端流程,然后当用户登陆您的应用程序时,在服务器身份验证后加载 fb js sdk 并获取客户端令牌,如下所示:

    FB.getLoginStatus(function(response) {
        if (response.status === "connected") {
            // response.authResponse has everything you need like signed request, access token, etc
            // you can also make FB.api request or use FB.ui which will use the client side token
        }
        else {
            // user is either logged out of facebook or hasn't authenticated your app
            // should not happen if the user went through the server side authentication
        }
    });
    

    此代码不需要用户与页面交互,因为它不会弹出新窗口。
    请注意,您的应用程序的客户端部分将使用与服务器上应有的令牌不同的令牌,并且这两个令牌将具有不同的过期时间(服务器寿命长,而客户端寿命短)。
    在我看来,这种方法更好、更安全,因为它不需要您将身份验证数据从客户端发送到服务器或以其他方式发送。

    【讨论】:

    • 感谢您的建议。我意识到我可以使用服务器端流程,但我希望避免它,因为 C#SDK 建议不要这样做。这让我觉得他们可能很快就会弃用对服务器端流程的支持。
    • 他们将弃用它,但您可以自己实现该功能,这不是一项艰巨的任务
    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多