Facebook Oauth注销


70

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

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

我要授权的步骤是:

  1. 致电[LINK: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中注销。有观点认为这有点愚蠢,但是如果有任何实际的实现方法,我很乐意遵守。

我看到了以下建议:

答:我使用Javascript API登出:FB.Connect.logout()。好吧,我尝试使用它,但是它没有用,而且我不确定如何使用,因为我在网站上未以任何方式使用Javascript API。该会话不是由Javascript API维护或创建的,因此我不确定该如何终止它。

B.使用[LINK:facebook.com/logout.php]。前一段时间,一位管理员在Facebook论坛上提出了此建议。给出的示例与获取FB会话的旧方法(非oauth)有关,因此我认为我无法在我的情况下应用它。

C.使用旧的REST api expireSession或revokeAuthorization。我尝试了这两种方法,尽管它们确实使Oauth令牌过期,但它们不会使浏览器当前正在使用的会话无效,因此它没有任何作用,用户也没有退出Facebook。

我确实有点松懈,Facebook文档不完整,模棱两可,而且效果很差。论坛上的支持不存在,目前我什至无法登录Facebook论坛,除此之外,他们自己的FB Connect集成甚至无法在论坛上使用。不会激发太大的信心。

Ta为您提供的任何帮助。德里克

ps。不得不将HTTPS更改为LINK,因果报应不足以发布链接,这可能足够公平。


1
肖恩(Sean)有一个要听的观点,因为他的声誉比您高,这使他正确。如果我登录了Facebook,那么我会进入您的网站,使用它(或者只是决定让您感到非常失望),然后注销,如果我发现我会感到惊讶,甚至会有些生气。也被注销了Facebook。如果UI明确表明会发生这种情况,那很好,但是,如果只是页面右上角显示“注销”的按钮,或者附近漂浮着Facebook徽标,那是相当令人惊讶的。惊喜不是好的UI的功能。
汤姆·安德森


@DigitalPrecision:一个很好的链接,它表明即使Facebook也无法做到这一点。
汤姆·安德森

2
同意 我们必须跳过障碍才能使其在我们的应用程序中正常工作。文件太恐怖了。
Mike Purcell

我遇到了完全相反的问题:注销我的自制应用程序时,我也立即注销了facebook。
Sliq 2013年

Answers:


43

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

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

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

尽管我也希望使用服务器端解决方案,但是至少它可以满足我的要求,但它在两个站点上都将我注销了。

我对Facebook集成的东西也很陌生,并且第一次使用它,但是我的总体感觉是文档非常分散,到处都是很多过时的东西。


谢谢克里斯托夫!我已经尝试过了,的确可以。我以前一直在尝试使用FB.Connect.logout和FB.Connect.logoutAndRedirect,我认为它们来自API的较旧版本。正如您所说,文档如果很零散。只是要添加-在调用FB.logout之前,我必须按照FB Javascript API页面上的说明调用FB.init。谢谢你的帮助。
Derek Troy-West 2010年

刚刚更新,此解决方案不适用于Mac上的Chrome(至少为5.0.375)。该用户没有登录FB出来,做工精细的Safari和Firefox,但..
德里克特洛伊方

我的注销页面必须进行一些FB登录检查。重定向前FB.logout()onclick的完成速度不够快。我必须延迟重定向,以确保FB.logout()首先成功完成。
bcm

18

到目前为止,此方法有效-并记录在Facebook网站@ http://developers.facebook.com/docs/authentication/上。不确定将它添加到文档中的最新时间,非常确定当我检查2012年2月时它不存在

您可以通过将用户重定向到

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


5
无法使它正常工作。使用服务器端连接方法。同样,如果文档链接指向此方法,则不再适用。
Daniel Gerson 2012年

@DanielGerson当您使用ssc时,您将从Facebook获得访问令牌作为响应。当您将访问令牌发送给客户端时,它将起作用,以便客户端可以在注销链接中使用它。
Reiner

18

此解决方案不再与FaceBook的当前API配合使用(似乎是从无意开始的)

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

尝试在您的登出链接或按钮上提供此链接,其中“ yoursitename.com”是您要在登出后重新定向到您的主页的位置。

有用..


Sumit,谢谢。那很好。我不完全确定为什么Facebook的移动版本可以让您像这样注销,而另一个却不可以,但我不在乎。它比我目前正在使用的jscript hack更好,并且也比此处描述的主要的Facebook注销+会话密钥更容易。
Derek Troy-West

5
但是,如果用户不希望其Facebook会话被破坏怎么办?如果他们已经登录到脸书,然后登录到您的网站,然后从您的网站注销,然后返回到Facebook,不知道为什么他们刚刚被注销该怎么办?这似乎不是完美的解决方案……
肖恩

2
几个月前提出此问题时,单身登出是facebook条款和条件的要求。我不确定是否仍然存在,并且我不同意您的意见,但当时是必需的。
Derek Troy-West

请参阅以下我的解决方案以了解目前
为止


5

您可以使用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会话。


由于$ facebook已经拥有令牌,因此您无需手动使用令牌。
zerkms,2010年

您能详细解释一下您的意思吗?此方法是我发现的唯一一种无需使用JavaScript即可注销用户并结束FB会话的方法
Zach Greenberger 2010年

2
Bob,这是注销URL的结构: facebook.com/… >其中session_key是如上所述的访问令牌的中间部分。
扎克·格林伯格

正如@Amir指出的那样,会话密钥与您在最初的OAuth授权期间从Facebook收到的“代码”相同。与尝试解析访问令牌相比,最好使用该令牌(因为令牌的格式可能会更改)。
安德斯·菲耶斯塔德

使用Zach使用的相同方法。以下是在RoR + Devise + Omniauth github.com/intridea/omniauth/wiki/中
Dex

1

使用PHP,我正在做:

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

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

很好,很容易,很容易,我现在正尝试查找注销按钮图形!


1

这是在当前(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>

0

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

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


0

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

目前,我正在写这篇文章,这是m.facebook.com的窍门不再起作用(至少对我而言),并且用户已重定向到移动FB登录页面,这显然对UX不利。

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

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


0

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

FB.logout(function(response) {});

0

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

Just add id to the anchor tag . <a id='fbLogOut' href="https://stackoverflow.com/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;


        });
});});

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.