Facebook - JavaScript SDK - 如何自动请求权限

时间:2012-04-06 08:04:24

标签: javascript facebook

我正在使用HTML 5开发一些内容并在同一个内插入Facebook JavaScript SDK。

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

1)如果用户未登录facebook,则会要求登录,但如果用户已登录并打开应用程序,则应自动请求延迟,而不是用户需要单击具有{{的链接1}}再次。

有一个Stack Overflow问题, How do I get my Facebook application to automatically ask for the required permissions post installation ,他们使用FB.LOGIN()执行此操作,但如何在JavaScript中找到此身份验证网址?

JavaScript代码:

window.top.location = "<?php echo $loginUrl; ?>";

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

我认为最好的选择是使用authenticated referrals功能,这意味着Facebook将为您处理身份验证以及您需要的权限。

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

如果出于任何原因不适合您,请查看authentication的文档,尤其是server-side flow的文档,因为它似乎就是您之后的内容你已经写过了。

在您的JavaScript代码中,您在启动Facebook SDK时似乎没有使用频道网址属性。正如它在JavaScript SDK documentation频道文件部分)中所述:

  

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

然后:

  

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。