我正在尝试使用 FB JavaScript SDK 设置一个非常基本的身份验证逻辑流程,以在执行操作之前检查用户的登录状态和权限(如果没有,则提示用户使用权限登录)。
- 用户在我的站点上的文本区域中键入一条消息以发布到他们的 Facebook 提要,然后单击我站点上的“发布到 Facebook”按钮。
- 为了响应点击,我使用 . 检查用户的登录状态
FB.getLoginStatus
。 - 在对 的回调中
FB.getLoginStatus
,如果用户未登录,则提示他们登录(FB.login
)。 - 在回调中,
FB.login
我需要确保他们拥有正确的权限,所以我打电话给FB.api('/me/permissions')
- 如果他们没有,我再次提示他们登录 (FB.login
)。
我遇到的问题是,每当我尝试FB.login
在回调中调用其他 FB 方法时,浏览器似乎都会忘记执行的来源(点击),因此会阻止弹出窗口。我想知道我是否缺少某种方式在检查用户状态后提示用户登录,而浏览器不会错误地认为它不是用户启动的弹出窗口?
我目前已经退回到只是FB.login()
先打电话。但是,这种方法的不良副作用是,如果用户已经使用权限登录并且我仍在调用FB.login
,则身份验证弹出窗口将在继续之前立即打开和关闭,尽管功能正常,但看起来相当有问题。
在做某事之前检查用户的登录状态和权限似乎是一种常见的流程,所以我觉得我错过了一些东西。这是一些示例代码。
<div onclick="onClickPostBtn()">Post to Facebook</div>
<script>
// Callback to click on Post button.
function onClickPostBtn() {
// Check if logged in, prompt to do so if not.
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
checkPermissions(response.authResponse.accessToken);
} else {
FB.login(function(){}, {scope: 'publish_stream'})
}
});
}
// Logged in, check permissions.
function checkPermissions(accessToken) {
FB.api('/me/permissions',
{'access_token': accessToken},
function(response){
// Logged in and authorized for this site.
if (response.data && response.data.length) {
// Parse response object to check for permission here...
if (hasPermission) {
// Logged in with permission, perform some action.
} else {
// Logged in without proper permission, request login with permissions.
FB.login(function(){}, {scope: 'publish_stream'})
}
// Logged in to FB but not authorized for this site.
} else {
FB.login(function(){}, {scope: 'publish_stream'})
}
}
);
}
</script>