Facebook客户端身份验证 - 来自OAuth对话框的http或https重定向

时间:2012-06-08 12:41:56

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

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

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

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

  1. 打开一个丑陋的弹出窗口
  2. 我希望登录屏幕自动显示(即无需用户再次点击)
  3. 因此我尝试重新设置客户端上的OAuth对话框。要使其工作,必须在顶部窗口中打开OAuth网址,这意味着我需要将redirect_uri作为apps.facebook.com/myapp传递。

    问题是,只有当我使用https作为prototcol时,这才有效。但如果用户已经在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对话框使用客户端流进行身份验证?或者我是否完全以错误的方式解决这个问题?

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

2 个答案:

答案 0 :(得分:0)

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

您要描述的内容是“服务器端身份验证流程” 您应该做的是实现服务器端流程,然后当用户登陆您的应用程序时,在服务器身份验证之后加载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
    }
});

此代码不要求用户与页面进行交互,因为它不会弹出新窗口 请注意,您的应用程序的客户端部分将使用与您在服务器上应该使用的令牌不同的令牌,并且这两个令牌将具有不同的到期时间(服务器在客户端较短时仍然存在)。 在我看来,这种方法更好,更安全,因为它不需要您将身份验证数据从客户端发送到服务器,反之亦然。

答案 1 :(得分:0)

  

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

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