用户更改密码后 Facebook iOS SDK 不会打开登录 UI (iOS 6)

Posted

技术标签:

【中文标题】用户更改密码后 Facebook iOS SDK 不会打开登录 UI (iOS 6)【英文标题】:Facebook iOS SDK won't open login UI after user changes password (iOS 6) 【发布时间】:2013-02-02 02:26:49 【问题描述】:

一些背景:用户之前安装了应用程序,授权 FB,一切正常,然后他们更改了他们的 FB 密码(通过 facebook.com),删除了应用程序,现在重新安装并首次运行它重装后再来一次。

我用allowLoginUI: YES 调用[FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler],读取权限为“email、user_about_me、user_birthday、user_interests、user_location”。

我进入completionHandlerFBSessionStateFBSessionStateClosedLoginFailed。错误的 NSLog 是这样的:

Error Domain=com.facebook.sdk Code=2 “操作无法完成。(com.facebook.sdk 错误 2。)” UserInfo=0x1cd68c00 com.facebook.sdk:ErrorLoginFailedReason=com.facebook. sdk:ErrorLoginFailedReason, com.facebook.sdk:ErrorInnerErrorKey=Error Domain=com.apple.accounts Code=7 “Facebook 服务器无法完成此访问请求:验证访问令牌时出错:会话已失效,因为用户已更改密码。” UserInfo=0x1cd5b970 NSLocalizedDescription=Facebook 服务器无法完成此访问请求:验证访问令牌时出错:由于用户更改了密码,会话已失效。

该内部错误域为ACErrorDomain,错误代码为ACErrorPermissionDenied。那么,如何让用户重新授权应用呢?

我曾尝试再次调用openActiveSessionWithReadPermissions,但这只是不断输出相同的错误。我也试过[FBSession.activeSession closeAndClearTokenInformation],但这似乎没有任何作用(大概是因为没有activeSession)。

【问题讨论】:

我遇到了非常相似的情况,除了我在完成处理程序中进入 FBSessionStateOpen 之外 session.accessTokenData.accessToken 无效!我可以清除问题的唯一方法是转到设置应用程序,输入新密码(即使没有迹象表明它是错误的)禁用对应用程序的访问,尝试登录,失败,返回设置并重新启用对应用程序的访问,尝试并最终成功。糟糕的。希望我能找到更好的解决方法。想知道这是否是操作系统错误。 我遇到了同样的问题。有人能解决这个问题吗? 我也有同样的问题。有人在这里有解决方案吗?谢谢。 【参考方案1】:

在 3.2.1 Facebook SDK 中遇到了一个非常相似的错误。就我而言,我进入了 FBSessionStateOpen 但获得了无效的访问令牌。正如问题所述,正常的 closeAndClearTokenInformation 甚至删除应用程序都无法修复它。在这种情况下,我能够重新加入的唯一方法是让用户在设置应用程序中更改他们的密码。所以这就是我所做的。

// In my completion handler FBSessionStateOpen is called BUT an
// invalid accessToken was detected.

[session closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, 
                                    NSError *error) 
  
     if (result == ACAccountCredentialRenewResultFailed ||
         result == ACAccountCredentialRenewResultRejected)
     
       [self showErrorMessage:NSLocalizedString(@"You may need to re-enter your Facebook password in the iPhone Settings App.\n", nil)];
     
     else 
     
        // attempt opening a session again  (after they have updated their account 
        // settings I end up here)

        [self facebookLogin];  // Performs openActiveSessionWithReadPermissions, 
                               // but this time around the token issued should be good.
     
 ];

这是我能想到的唯一务实的解决方案。

【讨论】:

这不是一个实际的解决方案,因为登录的 UI 仍然没有出现。您是否找到了一些在 UI 方面有效的东西,或者您只是向用户展示了一条消息? 我采用了上述方法。就我而言,use 已经更改了 fb 密码,但没有更新设置。【参考方案2】:

我认为您需要使用这样的代码获取新的访问令牌...

[FBSession.activeSession closeAndClearTokenInformation];
[[FBSession class] performSelector:@selector(renewSystemAuthorization)];
[FBSession openActiveSessionWithReadPermissions:nil
                               allowLoginUI:YES
                          completionHandler:^(FBSession *session, FBSessionState state, NSError *error) 


【讨论】:

不,这似乎不起作用。我确实在 iPhone 上收到了“Facebook:Blah 应用程序想访问您的个人资料”警报视图,但它最终返回了相同的 NSError。我也尝试过here 的方法,它看起来与FBSession 的renewSystemAuthorization 相同,但没有成功。

以上是关于用户更改密码后 Facebook iOS SDK 不会打开登录 UI (iOS 6)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 facebook SDK 在 iOS 中获取用户名和密码

更改权限后无法在 Cordova iOS 上使用 Facebook SDK 登录

适用于 iOS 的 Facebook SDK 登录

对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?

与 Facebook iOS SDK 共享后从 Facebook 注销

iOS Facebook SDK 分享照片和从 Facebook 应用程序注销后