Facebook Oauth退出

时间:2010-05-04 10:22:24

标签: facebook oauth logout

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

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

我要授权的步骤是:

  1. 致电[LINK:graph.facebook.com/oauth/authorize?client_id ...]
  2. 如果用户的浏览器还没有活动的FB会话,则此步骤将打开Facebook登录/连接窗口。一旦他们登录到Facebook,他们就会使用代码重定向到我的网站,我可以用它代替oauth令牌。

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

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

      1. 我打电话给一堆API来做事情:即[LINK:graph.facebook.com/me?access_token = ..]
      2. 让我们说我的用户想要退出我的网站。 FB条款和条件要求我执行单点登录,因此当用户退出我的站点时,他们也会退出Facebook。有人认为这有点愚蠢,但如果有任何实际可行的方法,我很乐意遵守。

        我见过以下建议:

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

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

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

        我真的有点松散,Facebook文档不完整,含糊不清,非常差。论坛上的支持是不存在的,目前我甚至无法登录到facebook论坛,除此之外,他们自己的FB Connect集成甚至不能在论坛本身上运行。没有太大的信心。

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

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

13 个答案:

答案 0 :(得分:41)

我遇到了同样的问题。我也使用oauth登录(我正在使用RubyOnRails),但是对于注销,我使用JavaScript使用这样的链接来执行:

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

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

虽然我更喜欢服务器端解决方案,但至少它做了我想要的,它会在两个网站上都记录下来。

我对Facebook集成的东西也很陌生并且第一次使用它,但我的总体感觉是文档遍布整个地方并且有很多过时的东西。

答案 1 :(得分:18)

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

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

尝试在您的注销链接或按钮“yoursitename.com”上提供此链接 在您注销后可能是您想要重定向到的主页。

有效..

答案 2 :(得分:18)

此作品现已发布 - 并且已在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

答案 3 :(得分:8)

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

来以编程方式将用户注销Facebook

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

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

更多详情:https://developers.facebook.com/docs/authentication

答案 4 :(得分:5)

您可以使用access_token

执行此操作
$access_array = split("\|", $access_token);

$session_key = $access_array[1];

您可以使用PHP SDK中的$session key生成功能注销URL。

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

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

答案 5 :(得分: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();
}

工作,现在只是想找到一个退出按钮图形,这很好,很容易!

答案 6 :(得分:1)

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

<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>

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

Christoph回答的一个注释: Facebook Oauth Logout 注销功能需要指定回调函数,否则将失败 它,至少在Firefox上。 Chrome无需回调即可运行。

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

答案 9 :(得分:0)

对于希望直接从后端登录用户的Python开发人员

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

幸运的是,FB PHP SDK有一个semi-documented solution(如果链接不能导致getLogoutUrl()功能,只需在该页面上搜索它)。 StackOverflow上至少还提到了这一点:Facebook php SDK getLogoutUrl() problem

BTW我刚才注意到这个问题Zach Greenberg got it right,但我将我的答案添加为Python开发人员的摘要。

答案 10 :(得分:0)

@Christoph:只是添加一些东西。我不这么认为这是一个正确的方法。同时在两个地方注销。(<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;


        });
});});

答案 11 :(得分:0)

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

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

答案 12 :(得分:-8)

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