Facebook API - javascript sdk:注销后状态显示“已连接”
Posted
技术标签:
【中文标题】Facebook API - javascript sdk:注销后状态显示“已连接”【英文标题】:Facebook API - javascript sdk: status shows 'connected' after logout 【发布时间】:2018-02-27 22:40:28 【问题描述】:我在 AngularJS 网站中使用 Facebook sdk for javascript。
我正在尝试使用 Facebook 登录名预先填写注册表单。第一次出现 facebook 模式,我输入我的信息,它登录并按预期获得所需的数据。
然后我完成注册,登录系统。并注销系统,同时执行 Facebook 注销。
然后我回去创建第二个注册,希望用不同的 facebook 帐户测试注册...
但是当我点击 Facebook 登录来预填表单时,SDK 并没有再次显示 Facebook 登录模式让我输入新登录,而是使用我以前的数据执行登录。
当我去查看原因时,我发现 Facebook 状态显示为“已连接”。因为我已经成功地执行了 Facebook 注销,所以我预计会断开连接。
我错了? 如何断开第一个用户的连接,以便在第二次注册时使用其他 Facebook 帐户?
要登录,我正在使用:
var deferred = $q.defer();
FB.getLoginStatus(function(response)
if (response.status === 'connected')
console.log('already logged in.');
deferred.resolve(response);
else
FB.login( function(response)
if (response.authResponse)
console.log('response: ' + JSON.stringify(response));
var access_token = response.authResponse.accessToken;
console.log('access token: ' + access_token);
console.log('Welcome! Fetching your information.... ');
deferred.resolve(response);
else
console.log('User cancelled login or did not authorize.');
deferred.reject('Error occured');
,
scope: 'public_profile, email, user_birthday',
return_scopes: true
);
);
return deferred.promise;
我的注销是这样的:
var deferred = $q.defer();
FB.logout(function(response)
// I've tried with and without this line of code:
FB.Auth.setAuthResponse(null, 'unknown');
console.log('FB service logged out');
deferred.resolve(response);
);
return deferred.promise;
从此参考Facebook JS SDK FB.logout() doesn't terminate user session 我尝试在注销后使用FB.Auth.setAuthResponse(null, 'unknown');
,但它对我不起作用。
【问题讨论】:
您确定您已退出 Facebook 吗? FB.logout 仅当用户在登录您的应用程序时登录 Facebook 时才会执行。如果他们之前已经登录过 Facebook,那么它只会将他们从您的应用程序中注销。 (如果您将 SDK 设置为自动识别回访用户,则后者有点毫无意义,因为一旦他们访问您的网站,它将再次自动登录。) 这不是一个应用程序,它是一个网站(我会在我的问题中更新)。所以我在网站上有一个 facebook 登录按钮,它打开 facebook 登录模式并返回一些用户数据。我使用这些数据登录我的网站。 ...稍后,当我从网站上注销用户时,我也会调用 facebook 注销。我不知道为什么,但似乎它没有按预期工作。 它是一个应用程序,它只是在网站平台上运行。 // 同样,如果用户之前已经登录过 Facebook,那么这将不会将他们从 Facebook 中注销。如果他们登录到 Facebook,JS SDK 将在下一页加载时“识别”他们。你还需要这个做什么?由于人们只允许拥有一个个人 Facebook 帐户,因此在同一设备上登录和注销多个用户并不是一种常见的用例...... 好吧,想象一下不同的人共享同一个桌面。例如,在网吧。我的网站有一个“与 facebook 联系”按钮。如何从 facebook sdk 中注销用户? 我的期望确实是 sdk 会识别登录 current facebook 页面的返回用户,并自动登录。但是,sdk 不应该推断曾经登录的 facebook 帐户每次仍然是相同的,因为人们可能会断开与 facebook 的连接并重新连接到不同的帐户。 【参考方案1】:我遇到了类似的问题,并通过在调用 API 的用户配置文件中有一个 Facebook 断开连接按钮来解决它:
DELETE /user-id/permissions/
https://developers.facebook.com/docs/graph-api/reference/user/permissions/
例如使用 Javascript SDK:
// remove permission, so that the user is asked to authenticate the app again
// or another user can login on the top right of the login popup
FB.api('/me/permissions', 'delete',
access_token: user.accessToken // use existing token from database
, (r) =>
if(r.success) user.accessToken = null; // remove token in database
);
【讨论】:
您知道在注销时删除会话的方法吗?它仍然存在。 @jamesemanon 您必须更准确地说您的意思是哪个会话/注销。您是指用户在 Facebook 上的注销,还是从您的网站注销?另请参阅***.com/questions/2764436/facebook-oauth-logout 在我的应用程序上注销用户(不是 facebook 本身)。但是我打开了多个标签,我可能是从 fb 应用程序登录的。但是,当我从我的应用程序中调用注销时,它应该清除所有内容.. 它没有。它仍然允许用户绕过登录(我在这个测试示例中)。我也试过删除注销回调的权限,没用。 Facebook 只是为您提供身份验证,您的应用将(很可能!)有一个单独的会话/帐户系统,该系统仅与 Facebook 帐户相关联。这在很大程度上取决于您使用的框架/等。如果你使用 vanilla FB API,没有其他任何东西,它应该也可以跨标签与 FB.logout() 一起使用。以上是关于Facebook API - javascript sdk:注销后状态显示“已连接”的主要内容,如果未能解决你的问题,请参考以下文章
facebook javascript API 中的分页如何工作?
Facebook Graph API 错误代码:2500 JavaScript
Facebook API - javascript sdk:注销后状态显示“已连接”
如何使用 Javascript 访问用户在 Facebook API 中创建的事件?