0

我正在使用 HTML 5 开发一些东西并在其中插入 Facebook JavaScript SDK。

我开发了一个 Facebook 应用程序,我想:

1)如果用户没有登录facebook,它会要求登录,但如果用户登录并打开应用程序,它应该自动请求权限,而不是用户需要FB.LOGIN()再次点击链接。

有一个 Stack Overflow 问题,如何让我的 Facebook 应用程序在安装后使用 自动请求所需的权限window.top.location = "<?php echo $loginUrl; ?>";但是如何在 JavaScript 中找到此身份验证 URL?

JavaScript 代码:

<div id="fb-root"></div>
<script>
    // Load the SDK asynchronously
    (function(d){
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        ref.parentNode.insertBefore(js, ref);
    }(document));

    // Init the SDK upon load
    window.fbAsyncInit = function() {
        FB.init({
            appId      : 'appid', // App ID
            channelUrl : '//www.domain.com/channel.html', // Channel file
            status     : true, // Check login status
            cookie     : true, // Enable cookies to allow the server to access the session
            xfbml      : true  // Parse XFBML
        });

        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                var uid = response.authResponse.userID;
                var accessToken = response.authResponse.accessToken;

                document.getElementById('auth-loggedout').style.display = 'none';
                document.getElementById('auth-loggedinnotauthenticate').style.display = 'none';
                document.getElementById('loginauthenicated').style.display = 'block';
            }
            else
                if (response.status === 'not_authorized') {
                    window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/";
                }
                else {
                    window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/";
                }
    });
</script>
4

2 回答 2

3

用这个:

FB.getLoginStatus(function(response) {
    if (response.authResponse) {
        fbUserId = response.authResponse.userID;
        token = response.authResponse.accessToken;
    }
    else {
        FB.login(function(response) {
            if (response.authResponse) {
                fbUserId = response.authResponse.userID;
                token = response.authResponse.accessToken;
            }
            else {
                 console.log('User cancelled login or did not fully authorize.');
            }
        }, {scope: 'user_location'});
    }
},true);
于 2012-04-06T08:56:01.693 回答
1

我认为对您来说最好的选择是使用经过身份验证的推荐功能,这意味着 Facebook 会为您处理身份验证以及您需要的权限。

只有在用户完成身份验证过程后,用户才会被传递给您的应用程序。

如果由于任何原因这不适合您,请查看身份验证文档,尤其是服务器端流程,因为这似乎就是您所写的内容。

从您的 JavaScript 代码来看,您在初始化 Facebook SDK 时似乎没有使用频道 URL 属性。正如它在JavaScript SDK 文档通道文件部分)中所述:

频道文件解决了某些浏览器中跨域通信的一些问题

进而:

channelUrl 参数是可选的,但建议使用。

我不能保证它会修复它,但它可能会。

它应该是这样的:

// Init the SDK upon load
window.fbAsyncInit = function() {
    FB.init({
        appId      : 'appid', // App ID
        channelUrl : '//www.domain.com/channel.html', // Channel File
        status     : true, // Check login status
        cookie     : true, // Enable cookies to allow the server to access the  session
        xfbml      : true  // Parse XFBML
    });

    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;

            document.getElementById('auth-loggedout').style.display = 'none';
            document.getElementById('auth-loggedinnotauthenticate').style.display = 'none';
            document.getElementById('loginauthenicated').style.display = 'block';
        }
        else
            if (response.status === 'not_authorized') {
                window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/";
            }
            else {
                window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/";
            }
});

// Load the SDK asynchronously
(function(d){
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
}(document));

如您所见,首先您需要定义window.fbAsyncInit回调方法,然后才加载 SDK。

于 2012-04-06T08:28:55.530 回答