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)进行,要求提供用户凭据。
重新进入应用程序(现在已登录,accessToken
和 expirationDate
都保存到 NSUserDefaults
)。
通过调用logout:
方法执行注销(现在已注销,accessToken
和expirationDate
均已从NSUserDefaults
中删除)
尝试再次登录,步骤与 2 中的步骤完全相同。
我意识到当我调用logout:
时,我确实从我的应用程序范围而不是global
范围(Facebook 应用程序/移动 Safari)从 Facebook 注销(accessToken
无效)。在 5.) 中,当我尝试再次登录时,应用程序进入后台,并且像往常一样在 Facebook 应用程序/移动 Safari 中再次进行登录尝试,但是我得到一个屏幕说我'已经登录:
您已经授权
...
。按“确定”继续。 以...
(不是你?)登录。
对于刚刚在我的应用程序中注销的用户来说,这是一种奇怪的行为。 我的问题是:
“我可以真的在我的应用程序内部从 facebook(我的意思是“全球”范围)注销吗?这也会影响使用 facebook 凭据的其他应用程序。但是,如果我不能这样做,我怎样才能避免上面描述的“奇怪的行为”?
谢谢
【问题讨论】:
【参考方案1】:这似乎是 Facebook SDK 的错误。如果设备上安装了 Facebook 应用程序,则更新access_token
。另一方面,access_token
和 expirationDate
无法更改。 :((
【讨论】:
【参考方案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