FB iOS SDK 自定义令牌缓存问题

Posted

技术标签:

【中文标题】FB iOS SDK 自定义令牌缓存问题【英文标题】:FB iOS SDK Custom Token Caching issue 【发布时间】:2013-09-05 17:08:29 【问题描述】:

我正在尝试使用自定义令牌缓存机制构建 ios 应用程序。我在设备上对 FB 进行身份验证,并将 FB 访问令牌存储在服务器上,与服务器上的会话令牌进行对比,然后从服务器发出 FB API 请求。

FB 登录工作正常。我能够将令牌缓存到我的服务器上。但真正的问题发生在我登录 FB 后下次运行应用程序时。

这是我检查我的应用是否已登录 FB 的流程。

1) 在我的服务器上点击一个 url,为我的应用程序获取给定会话令牌的 FBAccessToken。这是一个异步请求。 2) 异步请求回调被触发。如果存在令牌,请将其缓存在我的自定义 FBSessionTokenCachingStrategy 类中。 3) 在回调中,我使用以下方法初始化 FBSession 对象:

FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:@[@"basic_info"] urlSchemeSuffix:nil tokenCacheStrategy:self.tokenCache];

然后,我检查 session.state。如果我得到一个 FBSessionCreatedTokenLoaded,那么我决定继续使用 openBehaviour 方法。但是,即使令牌已缓存在服务器上并且 fetchFBAccessTokenData 返回 FBAccessTokenData 对象,我也会得到 FBSessionStateCreated 而不是 FBSessionStateCreatedTokenLoaded 。

想知道为什么会这样吗?

这是我的自定义 FBSessionTokenCachingStrategy 类的 fetchFBAccessTokenData 方法的实现:

-(FBAccessTokenData*) fetchFBAccessTokenData 

    NSLog(@"Fetching FB Access token");

    if (self.fbTokenData != nil) 
        NSLog(@"Found FB Token");

        FBAccessTokenData *fbTokenData = [FBAccessTokenData createTokenFromString:    [self.fbTokenData objectForKey:@"fb_token"] permissions:nil expirationDate:nil loginType:1 refreshDate:nil];

        NSLog(@"%@",fbTokenData.accessToken);

        return fbTokenData;
    
    return nil;

它返回一个 FBAccessTokenData 对象,但我仍然得到一个不正确的会话状态。

发生这种情况是因为我没有正确返回缓存的令牌吗?我正在根据 FB IOS SDK 文档中为自定义缓存给出的标准示例来实现我的代码。

【问题讨论】:

【参考方案1】:

看起来您的策略是返回一个没有权限的 FBAccessTokenData(这对于您的目的而言并非完全不合理,除非您还要存储权限)。但是,当您启动会话时,指定“basic_info”(虽然通常是一个很好的最佳实践,并且在要求登录会提示 UI 时需要)将导致它检查“basic_info”是否包含在缓存的令牌中。既然不是,它就不会加载缓存的令牌。出于您的目的,您应该能够使用 nil 权限数组来初始化会话。

【讨论】:

添加权限就可以了。现在可以了。请使用有关内部工作方式的相关信息更新您的文档示例。还要更新文档以包含有关在自定义缓存方案的情况下如何执行注销的详细信息。实施起来非常简单,但会让某些人的生活变得轻松。 目前还不清楚我们如何传递额外的权限。如果我通过的多于 basic_info,则调用失败。这里发生了什么? 看看这个链接,你和@Trupheenix 会感到自豪。 Stack Overflow 在页面底部。

以上是关于FB iOS SDK 自定义令牌缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

安装了 FB 应用程序的 SwiftUI 自定义 Facebook 登录

以管理员身份使用自定义令牌向 FB DB 发出 REST 请求

从 Web SDK 访问 Firebase 自定义令牌声明

Firebase admin sdk:用于授权的 idToken 或自定义令牌验证

“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌

自定义like按钮IOS SDK