首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Facebook SDK 3.1 -验证访问令牌时出错

Facebook SDK 3.1 -验证访问令牌时出错
EN

Stack Overflow用户
提问于 2012-09-26 19:55:31
回答 7查看 26.7K关注 0票数 37

我正在尝试将我的应用程序迁移到新的Facebook SDK3.1(支持iOS6身份验证)。

我让它工作得很好,所以我决定从FB网站上的授权应用程序列表中删除该应用程序,以便测试iOS是否会再次请求许可。

现在,我对[FBRequest requestForMe]的第一次调用导致了这个错误:

响应:

代码语言:javascript
运行
复制
{
  "error": {
    "message": "Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.",
    "type":"OAuthException",
    "code":190,
    "error_subcode":460
  }
}

以下是一些详细信息:

我尝试打开会话,如下所示:

代码语言:javascript
运行
复制
   [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                           switch (state) {
                                               case FBSessionStateOpen:
                                                   [self presentPostOptions];
                                                   break;

                                               case FBSessionStateClosed:
                                               case FBSessionStateClosedLoginFailed:
                                                   [FBSession.activeSession closeAndClearTokenInformation];
                                                   break;

                                               default:
                                                   break;
                                           }

然后我在FBSessionStateOpen状态下被回调(此时iOS还没有提供请求对话框,这是预期的吗)?Facebook记录了这一点:

代码语言:javascript
运行
复制
2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession INVALID transition from FBSessionStateCreated to FBSessionStateClosed
2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateOpen 

打开会话后,我在presentPostOptions中执行以下操作:

代码语言:javascript
运行
复制
- (void)presentPostOptions
{    
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {
            self.usersName = user.name;
            self.usersID = user.id;

            [self getPages];
        }
        else
        {
            [self didFailWithError:error];
        }
    }];
}

在回调上面的完成块之前,我的主状态处理程序块是用一个FBSessionStateClosed状态调用的。同时,Facebook SDK已经记录了上述错误。

我找不到任何方法来重置系统;我也不是真的理解原因。

有没有人能说点什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-09-30 00:09:10

设备上的Facebook帐户与服务器以及应用程序/SDK的缓存不同步。这可以通过调用ACAccountStore方法renewCredentialsForAccount来解决,该方法将更新操作系统对令牌状态的理解。

在SDK的下一次更新中,当SDK收到服务端的响应,表示某个token已经失效时,SDK会自动调用此接口。对于SDK的3.1.0版本,应用程序需要显式调用此API。下面是一个代码示例:

代码语言:javascript
运行
复制
ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
    (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 &&
        (account = [fbAccounts objectAtIndex:0])){

        [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            //we don't actually need to inspect renewResult or error.
            if (error){

            }
        }];
    }
}

调用API的位置/时间有几个选项。最简单的地方是在应用程序启动或视图加载时进行机会主义调用。这种方法的一个问题是,它将导致通常不必要的网络往返。另一种选择是在发生会话更改通知时调用它,表明会话已关闭。此外,许多应用程序在应用程序启动时获取一些基本信息,如raph.facebook.com/me,如果是这样的话--在出现错误响应的情况下调用此方法可能是请求iOS更新其令牌状态的合理位置。

希望这能有所帮助!

票数 76
EN

Stack Overflow用户

发布于 2012-11-06 19:39:13

我只想贡献另一个让我浪费3个小时的东西:如果你试图以非应用开发者的FB用户登录,请确保你的FB应用程序设置没有打开'Sandbox‘选项……这可能很明显,但希望能为其他人节省几个小时。

票数 7
EN

Stack Overflow用户

发布于 2012-09-29 01:34:49

试着在你的iOS应用程序的settings panel中添加你的Facebook应用程序包ID作为建议的here

希望这能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12601191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档