facebook-ios-sdk 注销问题

Posted

技术标签:

【中文标题】facebook-ios-sdk 注销问题【英文标题】:facebook-ios-sdk logout question 【发布时间】:2011-09-07 18:57:33 【问题描述】:

我在这里看到了很多关于 Facebook Graph API 的问题,但我仍然没有找到使用它进行简单“登录”/“注销”操作的解决方案。看起来单点登录风格造成的混乱多于好处。

我想知道是否可能有以下情况:

    在应用中输入(未创建accessToken/expirationDate)。 通过调用 authorize:delegate: 方法使用 SSO 执行登录(应用程序进入后台,登录在“全局”范围内(Facebook 应用程序/移动 Safari)进行,要求提供用户凭据。 重新进入应用程序(现在已登录,accessTokenexpirationDate 都保存到 NSUserDefaults)。 通过调用logout: 方法执行注销(现在已注销,accessTokenexpirationDate 均已从NSUserDefaults 中删除) 尝试再次登录,步骤与 2 中的步骤完全相同。

我意识到当我调用logout: 时,我确实从我的应用程序范围而不是global 范围(Facebook 应用程序/移动 Safari)从 Facebook 注销(accessToken 无效)。在 5.) 中,当我尝试再次登录时,应用程序进入后台,并且像往常一样在 Facebook 应用程序/移动 Safari 中再次进行登录尝试,但是我得到一个屏幕说我'已经登录:

您已经授权...。按“确定”继续。 以...(不是你?)登录。

对于刚刚在我的应用程序中注销的用户来说,这是一种奇怪的行为。 我的问题是:

“我可以真的在我的应用程序内部从 facebook(我的意思是“全球”范围)注销吗?这也会影响使用 facebook 凭据的其他应用程序。但是,如果我不能这样做,我怎样才能避免上面描述的“奇怪的行为”?

谢谢

【问题讨论】:

【参考方案1】:

这似乎是 Facebook SDK 的错误。如果设备上安装了 Facebook 应用程序,则更新access_token。另一方面,access_tokenexpirationDate 无法更改。 :((

【讨论】:

【参考方案2】:

除了 kishnan94 答案。目标 c 版本是 ;

如果您想打开一个模式并从 Safari 或 Facebook 应用程序中单独询问 facebook 凭据,只需使用最新的 facebook sdk 并设置登录行为

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login setLoginBehavior:FBSDKLoginBehaviorWeb];

这将使用户在不使用 safari 或 facebook 应用帐户的情况下注销过程更加方便且不会造成混淆。

【讨论】:

【参考方案3】:

在Facebook的新SDK中,可以设置登录按钮loginBehaviour属性

下面的代码在 swift ...

let fbButton = FBSDKLoginButton()
fbButton.loginBehavior = .Web

【讨论】:

【参考方案4】:

答案已经完成,但我只是想澄清一下。可能是它节省了某人的时间。

去 Facebook.m 换行

  [self authorizeWithFBAppAuth:YES safariAuth:YES];

  [self authorizeWithFBAppAuth:YES safariAuth:NO];

这将导致登录窗口出现在应用程序内。注销将完美运行。换句话说,它将像以前在旧版本的操作系统中一样工作。

【讨论】:

【参考方案5】:

爱德华多,

我感受到你的痛苦!我花了一天的大部分时间来解决这个问题。我发现当您使用 SSO 和通话时:

从您的代码调用:

[facebook logout:self];

Facebook API 方法:

- (void)logout:(id<FBSessionDelegate>)delegate 

  self.sessionDelegate = delegate;
  [_accessToken release];
  _accessToken = nil;
  [_expirationDate release];
  _expirationDate = nil;

  NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];

  for (NSHTTPCookie* cookie in facebookCookies) 
    [cookies deleteCookie:cookie];
  

  if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogout)]) 
    [_sessionDelegate fbDidLogout];
  

facebook API 确实使访问令牌和过期日期变量无效,并尝试删除移动 Safari cookie,但由于某种原因,可能是 Apple 的错,cookie 没有真正删除。因此,当您下次尝试登录时,您的移动 Safari 会看到 cookie 并显示:

"You have already authorized .... Press "Okay" to continue. Logged in as ... (Not You?)."

在 Facebook 找到修复程序或 Apple 修复其损坏的 API 之前,我们必须通过 Safari 绕过 SSO。以下是我对 Facebook.m 所做的更改,以强制使用旧的登录对话框。如果您使用这些更改,它们可能不会永远有效,但我猜它们会持续很长时间。还要确保这适用于我在这篇文章(2011 年 11 月版本)更新到最新的最新 facebook API。

从您的代码调用:

[facebook authorize:permissions];

Facebook API 方法:

- (void)authorize:(NSArray *)permissions 
  self.permissions = permissions;

//  [self authorizeWithFBAppAuth:YES safariAuth:YES];
    [self authorizeWithFBAppAuth:NO safariAuth:NO];

如果这对你有帮助,请给这个帖子和我的帖子评分,以帮助其他人找到它。

鲶鱼

【讨论】:

你,先生,救了我的培根!【参考方案6】:

嗨,

这是不可能的,原因是单点登录 (SSO) 不是让用户每次都登录,而是注销,而是如果用户登录任何启用 FB 的应用程序 - 它将使用它再次登录 - 这是因为该设备主要由一个人使用,在这种情况下,只有一个用户可以登录 Facebook。

您无法控制应用程序之外的任何应用程序 - 例如 - 如果您使用 Gmail 登录,并且当您打开 google.com 时,您可以看到您当前登录的用户名,其中有 SSO,

【讨论】:

Karthieyan,您对 SSO 的原因是正确的,您的示例非常清楚。我的目标是只在我的应用程序中控制 FB 的使用,并允许多个用户登录并发布到他们自己的 FB 个人资料。换句话说,我的应用程序是一个具有许多用户情况的设备。我的主要问题是:“Facebook 注销功能调用是否假设要求用户在下次从应用程序访问 Facebook 时使用密码重新验证,而不仅仅是浏览器 cookie。”在此先感谢,gadildafishs【参考方案7】:

恐怕答案是否定的,你不能这样做。

您的应用程序位于沙箱中,无法在外部写入全局 cookie(用于移动 safari)和 Facebook 应用程序设置(我认为在 Facebook 应用程序首选项/cookies 中)

您只能警告您的用户退出您的应用程序...

...或者您可以不使用 facebook api SSO,而是在应用程序登录 webform 中使用,就像我出于其他原因一样。

如果您选择该选项this pull request 可能会为您节省一些时间;)

【讨论】:

我了解沙盒的概念,但如果用户没有安装 Facebook 应用程序,我应该警告“嘿用户,去 Safari 并清除所有 cookie”吗?看起来通过这个 API 我可以登录并影响全局范围,但反之则不然。我错了吗? 你是对的,它是一个 SSO,但是多重注销...并且主要登录在您的应用之外,您没有任何控制权...人们不是应该经常注销,这就是为什么在大多数情况下都可以的原因。如果没有,我刚刚编辑了我的答案以绕过 facebook api 中的 SSO。 现在事情对我来说更清楚了。但是,普通用户并不关心整个全球/沙盒故事。当遇到“注销”按钮时,它应该注销并在下一次执行新登录(要求提供凭据),否则用户会认为注销操作不成功(尽管它在应用范围)。这是人们每天都习惯做的事情。鉴于这种情况,应用程序内部的“注销”按钮是否有意义?我可以忽略所有这些并使用旧的 API。指导方针是什么? 使用最新的 API,但没有 SSO,使用我在我的答案中链接的补丁...(转到我在那个 gihub 拉取请求 cmets 中链接的 SO 答案以获取更多详细信息)仅在您的应用程序内。没有更多问题,并且是最新的api,这是可取的。 不,你可以,请看下面我的回答

以上是关于facebook-ios-sdk 注销问题的主要内容,如果未能解决你的问题,请参考以下文章

Cloudbees Jenkins shell 访问被拒绝 Facebook-iOS-SDK

如何在使用 facebook-ios-sdk 的应用中实现聊天

在 Facebook-Ios-Sdk 中关闭 Facebook 会话

ParseFacebookUtilsV4 和 Facebook-iOS-SDK 4.0

使用静态库(facebook-ios-sdk)中定义的协议时出现不完整的协议警告

如何在 iPhone 上从 Facebook 注销(本机/集成)