71

我有一个使用 Oauth 2 与 Facebook 集成的应用程序。

我可以使用 FB 进行授权并很好地查询他们的 REST 和 Graph API,但是当我授权时,使用 FB 创建了一个活动的浏览器会话。然后我可以很好地注销我的应用程序,但是与 FB 的会话仍然存在,因此如果其他人使用浏览器,他们将看到以前的用户 FB 帐户(除非以前的用户也手动注销了 FB)。

我授权的步骤是:

  1. 致电 [链接:graph.facebook.com/oauth/authorize?client_id...]

如果用户的浏览器还没有活动的 FB 会话,此步骤将打开 Facebook 登录/连接窗口。一旦他们登录到 Facebook,他们就会使用我可以交换 oauth 令牌的代码重定向到我的网站。

  1. 使用 (1) 中的代码调用 [LINK: graph.facebook.com/oauth/access_token?client_id..]

现在我有一个 Oauth 令牌,用户的浏览器登录到我的网站,并登录到 FB。

  1. 我调用一堆 API 来做事:即 [LINK: graph.facebook.com/me?access_token=..]

假设我的用户想要退出我的网站。FB 条款和条件要求我执行单点注销,因此当用户退出我的站点时,他们也会退出 Facebook。有人认为这有点愚蠢,但如果有任何方法可以真正实现这一点,我很乐意遵守。

我看到了以下建议:

A. 我使用 Javascript API 注销:FB.Connect.logout()。好吧,我尝试使用它,但它不起作用,而且我不确定它到底是怎么做到的,因为我没有在我的网站上以任何方式使用 Javascript API。该会话不是由 Javascript API 维护或创建的,所以我也不确定它应该如何过期。

B. 使用 [链接:facebook.com/logout.php]。这是前段时间 Facebook 论坛中的管理员建议的。给出的示例与获取 FB 会话(非 oauth)的旧方式有关,所以我认为我不能在我的情况下应用它。

C. 使用旧的 REST api expireSession 或 revokeAuthorization。我尝试了这两种方法,虽然它们确实使 Oauth 令牌过期,但它们不会使浏览器当前正在使用的会话无效,因此它没有效果,用户没有从 Facebook 注销。

我真的有点不知所措,Facebook 文档不完整、模棱两可而且很差。论坛上的支持是不存在的,目前我什至无法登录 facebook 论坛,除此之外,他们自己的 FB Connect 集成甚至在论坛本身上都不起作用。不会激发太多的信心。

Ta 可以提供任何帮助。德里克

附言。不得不将 HTTPS 更改为 LINK,没有足够的业力来发布链接,这可能足够公平。

4

13 回答 13

44

我有同样的问题。我也使用 oauth 登录(我使用的是 RubyOnRails),但对于注销,我使用 JavaScript 使用如下链接进行登录:

<a href="/logout" onclick="FB.logout();">Logout</a> 

这首先调用该onclick函数并在 facebook 上执行注销,然后/logout调用我网站的正常函数。

虽然我也更喜欢服务器端解决方案,但至少它可以满足我的需求,它会让我在两个站点上都退出。

我对 Facebook 集成的东西也很陌生,并且是第一次玩它,但我的总体感觉是文档遍布各处,有很多过时的东西。

于 2010-05-10T06:03:17.643 回答
19

此解决方案不再适用于 FaceBook 当前的 API(似乎一开始是无意的)

http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com;

尝试在您的注销链接或按钮上提供此链接,其中“yoursitename.com”是您要在注销后重定向回来的位置可能是您的主页。

有用..

于 2010-07-28T06:14:19.467 回答
19

这在现在有效 - 并记录在 facebook 的网站 @ http://developers.facebook.com/docs/authentication/上。不确定它是多久添加到文档中的,当我检查 2012 年 2 月时很确定它不存在

您可以通过将用户重定向到以编程方式登录 Facebook 的用户

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

于 2012-03-21T06:09:55.417 回答
11

我可以通过将用户重定向到以编程方式将用户注销 Facebook

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

下一个参数中提供的 URL 必须是与应用程序设置中定义的应用程序具有相同基域的 URL。

更多细节:https ://developers.facebook.com/docs/authentication

于 2012-10-09T04:27:31.977 回答
6

您可以使用以下命令执行此操作access_token

$access_array = split("\|", $access_token);

$session_key = $access_array[1];

您可以$session key在 PHP SDK 中使用它来生成功能性注销 URL。

$logoutUrl = $facebook->getLogoutUrl(array('next' => $logoutUrl, 'session_key' => $session_key));

这将结束浏览器的 facebook 会话。

于 2010-05-29T21:11:01.967 回答
2

使用 PHP 我正在做:

<a href="?action=logout">logout.</a>

if(isset($_GET['action']) && $_GET['action'] === 'logout'){
    $facebook->destroySession();
    header(WHERE YOU WANT TO REDIRECT TO);
    exit();
}

工作,很好,很容易我现在只是想找到一个注销按钮图形!

于 2014-03-14T10:53:17.480 回答
2

这是在当前(2.12)版本的 API 中工作的已接受答案的替代方案。

<a href="#" onclick="logoutFromFacebookAndRedirect('/logout')">Logout</a>

<script>
    FB.init({
        appId: '{your-app-id}',
        cookie: true,
        xfbml: true,
        version: 'v2.12'
    });

    function logoutFromFacebookAndRedirect(redirectUrl) {
        FB.getLoginStatus(function (response) {
            if (response.status == 'connected')
                FB.logout(function (response) {
                    window.location.href = redirectUrl;
                });
            else
                window.location.href = redirectUrl;
        });
    }
</script>
于 2018-03-22T19:33:01.177 回答
1

Sumit 建议的移动解决方案非常适用于 AS3 Air:

html.location = "http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com"

于 2010-09-13T21:25:11.840 回答
1

Christoph 回答的注释: Facebook Oauth Logout 注销函数需要指定一个回调函数,如果没有它,至少在 Firefox 上会失败。Chrome 无需回调即可工作。

FB.logout(function(response) {});
于 2010-11-26T19:45:19.493 回答
1

对于想要直接从后端注销用户的 Python 开发人员

在我写这篇文章的那一刻,m.facebook.com的技巧不再有效(至少对我来说),用户被重定向到移动 FB 登录页面,这显然不利于用户体验。

幸运的是,FB PHP SDK 有一个半文档化的解决方案(如果链接没有导致getLogoutUrl()功能,只需在该页面上搜索即可)。StackOverflow 上的至少另一个也提到了这一点:Facebook php SDK getLogoutUrl() 问题

顺便说一句,我刚刚注意到Zach Greenberg在这个问题上做得对,但我将我的答案添加为 Python 开发人员的总结。

于 2011-05-15T13:43:54.030 回答
1

@Christoph:只是添加 someting 。我不认为这是正确的方法。同时在两个地方注销。(<a href="/logout" onclick="FB.logout();">Logout</a>)。

Just add id to the anchor tag . <a id='fbLogOut' href="/logout" onclick="FB.logout();">Logout</a>



$(document).ready(function(){

$('#fbLogOut').click(function(e){ 
     e.preventDefault();
      FB.logout(function(response) {
            // user is now logged out
            var url = $(this).attr('href');
            window.location= url;


        });
});});
于 2013-12-08T21:16:07.550 回答
1

Update:这个解决方案有效,只是调用 'FB.logout()' 不起作用,因为浏览器希望用户交互来实际调用此函数,以便它知道 - 它是用户而不是脚本。

<a href="#" onclick="FB.logout();">Logout</a> 
于 2014-02-28T11:17:15.680 回答
-7

很简单,只需输入:$facebook->setSession(null); 注销

于 2010-07-17T08:07:15.207 回答