【问题标题】:Any way to pull out session key from access token returned by Facebook iOS SDK?有什么方法可以从 Facebook iOS SDK 返回的访问令牌中提取会话密钥?
【发布时间】:2011-07-06 06:52:10
【问题描述】:

我需要在这个场景中使用 Facebook 会话密钥:http://developers.facebook.com/docs/chat/#platauth

但是,当前的 Facebook iOS SDK 向我们返回了一个访问令牌,这对于这种情况来说是不够的。我挖了很多,在这里发现了这个问题:

http://www.quora.com/Do-the-OAuth2-access-tokens-in-the-new-Facebook-Graph-API-expire

但它描述的格式与我们得到的访问令牌没有相似之处。

我对这些事情有点困惑。

顺便说一句,我检查了一个针对old Facebook SDK 的旧版本 iPhone 进行测试,因为这个旧版 SDK 直接提供会话密钥,但是这个 SDK 现在在成功登录后总是显示来自 Facebook 的错误页面。似乎这个 SDK 已被完全弃用?

为了明确这个问题,这是我从Facebook iOS SDK 获得的访问令牌(嵌入在 URL 中):

fb193174047373858://authorize/#access_token=IwDbeiWINrotP3JOd1EGoEY7OmOBd2DyV8lh73mutCM.eyJpdiI6IkdKd3BvWlItcWlWRzIwTGYtUkRUVWcifQ.J6qNtSibMmm0yFe2QNHG46jnIUXef3dV-NnbYqXkfrFABjPrgMPQRUeKHJ3GxX1T3nlU7-4P8FUT6dlfwSwHfNJrheTUZIXdd3AlsSRUiUer5xEdFA9IsGEMn6GyHheH9DSr76IeZcBjl-_s4ub3kg&expires_in=0

【问题讨论】:

  • 计划于 10 月 1 日弃用“auth.promoteSession”Facebook API 将使上述 hack 失效且没有必要(现在只需要 OAuth 2.0 访问令牌,并且不需要 md5 签名计算生成身份验证响应)。虽然我在 Facebook 上找不到官方文档,但所有细节都可以在这个问题中找到:facebook.stackoverflow.com/questions/7395284/…

标签: objective-c ios facebook facebook-chat x-facebook-platform


【解决方案1】:

当前 FB 访问令牌具有以下格式('|' 是分隔符): || 例如,对于这样的 access_token: 146012674543599|de29194522ad43g16ec2ca9b-612345672|kK5HvfSTbJx-x21rMsTyttifij0 会话密钥是:de29194522ad43g16ec2ca9b-612345672

干杯

【讨论】:

  • Facebook 上是否使用了不同种类的访问令牌?目前Facebook的iOS版SDK,我使用了我这个令牌:FB {} app_id_here://authorize/#access_token=IwaaaaaaaaaaaaJOd1EGoEY7OmOBd2DyV8lh73mutCM.eyJpdiI6IkdKd3BvWlItcbbbbbbbbbbbbkRUVWcifQ.J6qNtSibMmm0yFe2QNHG46jnIUXef3dV-NnbYqXkfrFABjPrgMPQRUeKHJ3GxX1T3nlU7-4P8FUT6dlfwSwHfNJrheTUZIXdd3AlsSRUiUer5xEdFA9IsGEMn6GyHheH9DSr76IeZcBjl-_s4ub3kg&expires_in=0。我认为我不能在此访问令牌上应用您的方法来提取会话密钥。希望这能说明我的问题。
【解决方案2】:

我仍然没有将 FBAppAuth-ed 或 SafariAuth-ed access_token 片段转换为 session_id 的公式。但是,以下描述将有助于在所描述的公式中获取 access_token,然后可以轻松地将其分段以导出 session_id。希望这可以帮助。

在 iOS SDK 版本 2 中,登录由 Facebook 类中的以下 API 处理:

- (void)authorize:(NSArray *)permissions delegate:(id<FBSessionDelegate>)delegate;


在同一个 API 的实现中,如果我们关闭 FBAppAuth 和 SafariAuth,则会调用登录对话框,返回的 access_token 格式为 APP_ID |会话密钥 |文摘

- (void)authorize:(NSArray *)permissions delegate:(id<FBSessionDelegate>)delegate 
{
  [_permissions release];
  _permissions = [permissions retain];
  _sessionDelegate = delegate;
    //[self authorizeWithFBAppAuth:YES safariAuth:YES];
  [self authorizeWithFBAppAuth:NO safariAuth:NO]; // Turned off FBApp and Safari auth
}


返回的 access_token 可以在 Facebook 类中的以下回调方法中捕获(请放置一个 NSLog 打印令牌):

- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate 


【讨论】:

  • 谢谢。我想您只是指出了 facebook 当前支持的不同身份验证方法:FBAppAuth、SafariAuth 和“旧版”?通过禁用 FBAppAuth 和 SafariAuth 方法,它将退回到提到的登录对话框和所需的令牌格式。希望我理解正确。
  • 我现在使用的当前方法是按照这里的建议using legacy REST auth API。这样我就没有限制我应该使用哪种方法。有一些先决条件,那里也提到了。希望对您有所帮助。
  • 这种方法的问题是它破坏了单点登录。
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多