如何从Facebook弹出一个对话框,请求用户;允许;对于开放图?

如何从Facebook弹出一个对话框,请求用户;允许;对于开放图?,facebook,facebook-graph-api,Facebook,Facebook Graph Api,在我的Facebook应用程序中,我请求3个范围:电子邮件、发布流、发布操作 我正在使用FB.login函数。这两个步骤会弹出 当用户在第一步中单击“取消”时,FB.login将显示“状态:未知”作为响应对象 但是,当用户在第二步中单击“取消”时,FB.login将其显示为“状态:已连接”,并将其视为用户已接受所有内容 我最近了解到,您可以检查用户是否允许使用 FB.api('/me/permissions', function (response) { console.log(resp

在我的Facebook应用程序中,我请求3个范围:电子邮件、发布流、发布操作

我正在使用FB.login函数。这两个步骤会弹出

当用户在第一步中单击“取消”时,FB.login将显示“状态:未知”作为响应对象

但是,当用户在第二步中单击“取消”时,FB.login将其显示为“状态:已连接”,并将其视为用户已接受所有内容

我最近了解到,您可以检查用户是否允许使用

FB.api('/me/permissions', function (response) {
    console.log(response);
} );
我的问题是……知道用户拒绝打开图形步骤,我怎么才能再次弹出该对话框?


您是正确的,第二阶段是可选的,用户不必接受您请求的所有扩展权限,也不必接受其中的任何一个,正如auth dialog文档部分中所述:

用户将能够删除这些权限中的任何一个,或跳过此操作 完全转移,这将导致拒绝每个扩展的许可 你已经要求了。您的应用程序应该能够处理任何 已安装用户的扩展权限子集

我认为最好的方法是让你的应用程序管理用户接受的内容,但如果你在可选阶段(扩展权限)拥有权限,那么你可以这样做:

FB.init({
    ....
});

var requiredPermissions = ["email", "publish_stream", "publish_action"];

function checkPermissions(response) {
    var ok = true;

    if (!response.data || response.data.length != 1)
        ok = false;
    else for (var perm in requiredPermissions) {
        if (!(perm in response.data[0])) {
            ok = false;
            break;
        }
    }

    if (!ok)
        login();
    else
        console.log("Hey there user who granted all the required permissions");
}

function loginCallback(response) {
    if (response.authResponse) {
        FB.api("/me/permissions", checkPermissions);
    }
    else {
        console.log("User cancelled login or did not fully authorize.");
    }
}

functoin login() {
    FB.login(loginCallback, { scope: requiredPermissions.join(",") });
}
我还没有测试过这段代码,但它是朝着正确的方向前进的。 此外,此代码将永远持续下去,直到用户接受所有权限或放弃,您应该以某种方式让他知道您需要这些权限,并将再次向他发送auth对话框


编辑 我总是忘了在回答中包括这一点: 调用会打开一个新的弹出窗口,浏览器通常会阻止它,除非这是用户操作的结果,如文档中所述:

调用FB.login会导致JS SDK尝试打开弹出窗口 窗户。因此,此方法只能在用户单击后调用 事件,否则弹出窗口将被大多数浏览器阻止

它还说:

如果您需要从已经拥有权限的用户收集更多权限 使用您的应用程序进行身份验证,然后使用 您希望用户授予的权限。在“身份验证”对话框中, 用户只会被要求获得他们尚未拥有的权限 当然

这意味着这是一种做你想做的事情的方式,弹出窗口可能没有打开,因为它被你的浏览器阻止了。
您需要修改我给您的代码,以便每次调用登录功能时,都是在用户与您的页面交互之后,即:显示一条消息,说明“应用程序需要此权限和那个权限,请单击此按钮继续”,然后将调用登录功能。

如果用户拒绝第二步,登录不再弹出对话框。这听起来不太可能,我用我认为错误的内容修改了我的答案。