【问题标题】:Can't get user info from Facebook with OAuth 2.0无法使用 OAuth 2.0 从 Facebook 获取用户信息
【发布时间】:2011-04-10 04:08:14
【问题描述】:

用户登录后,我使用以下代码检索用户信息:

[_facebook requestWithGraphPath:@"me" andDelegate:self];

它在前几次工作,但最终返回一个错误。我认为这是一个会话,因为我的权限有“offline_access”。我从 Facebook 注销并从干净的构建中再次编译,它仍然返回此错误:

Error Domain=facebookErrDomain Code=10000 UserInfo=0x54a2930 “操作无法完成。(facebookErrDomain 错误 10000。)”

我假设我的访问令牌是有效的,因为我可以发帖。我这样认为是对的吗?

我还注意到,每当我登录时,如果我允许我的应用访问我的用户信息,Facebook 不会重定向我以请求许可。

谁能告诉我怎么了?

【问题讨论】:

  • 嗯.. 很多人也有同样的问题。到目前为止,强制 isSessionValid 返回 TRUE 或分配您自己的到期日期是可行的。

标签: ios facebook facebook-graph-api oauth-2.0 facebook-ios-sdk


【解决方案1】:

授权命令的答案似乎不同。现在,没有像以前那样的有效期。我尝试强制 isSessionValid 返回 TRUE,它可以工作。

isSessionValid 检查 accessToken 和 expirationDate。由于没有到期日期,该函数返回 FALSE。

不知道这是来自 facebook 的临时修改,还是最终修改。在这种情况下,SDK 必须是固定的,我想。并且新调用必须检索 expireDate。

【讨论】:

  • Facebook 今天好像已经修复了。现在有一个 expiresDate (expires_in='value') 如果没有offline_access 被请求,并且 expires_in=0 有一个offline_access。
【解决方案2】:

这是我使用的临时修复程序。您可以在 FBLoginDialog.m 中找到此方法第 46 行

- (void) dialogDidSucceed:(NSURL*)url {
  NSString *q = [url absoluteString];
  NSString *token = [self getStringFromUrl:q needle:@"access_token="];
  NSDate *expirationDate = [NSDate distantFuture];

  if ((token == (NSString *) [NSNull null]) || (token.length ==0)) {
    [self dialogDidCancel:url];
    [self dismissWithSuccess:NO animated:YES];
  } else {
    if ([_loginDelegate respondsToSelector:@selector(fbDialogLogin:expirationDate:)]) {
      [_loginDelegate fbDialogLogin:token expirationDate:expirationDate];
    }
    [self dismissWithSuccess:YES animated:YES];
  }
}

遇到此问题的每个人都请求offline_access 权限吗?这是我可以看到未发送到期日期的唯一原因。也许尝试不请求offline_access权限。

【讨论】:

  • 嘿,谢谢,它成功了。顺便说一句,我也试过不请求离线访问,它仍然返回一个空的到期日期。
【解决方案3】:

我也遇到了同样的问题。我检查了我的隐私设置、权限、其他方法等...,但我无法解决它。 许多网站说“检查访问offline_access/read_stream/publish_stream的权限”,我认为这些也很重要,但我无法解决。

然后我终于找到了以下解决方案,它工作正常。

您应该在“Facebook.m”文件中将“safariAuth:YES”更改为“safariAuth:NO”。

- (void)authorize:(NSArray *)permissions
         delegate:(id<FBSessionDelegate>)delegate {
            [_permissions release];
            _permissions = [permissions retain];
            _sessionDelegate = delegate;

            //[self authorizeWithFBAppAuth:YES safariAuth:YES];
            //You can get auth_token in iOS App!
           [self authorizeWithFBAppAuth:YES safariAuth:NO];      
}

如果您已登录,则可以使用以下方法获取自己的信息。

[facebook requestWithGraphPath:@"me" andDelegate:self];

如果您还没有登录,请先通过以下方法登录。

permissions =  [[NSArray arrayWithObjects:
             @"email", @"read_stream", @"user_birthday", 
             @"user_about_me", @"publish_stream", @"offline_access", nil] retain];
if (![facebook isSessionValid]) {
    [facebook authorize:permissions delegate:self];
}

以下帖子救了我。非常感谢! How to retrieve Facebook response using Facebook iOS SDK

祝你好运,编码愉快! 谢谢。

【讨论】:

    【解决方案4】:

    我遇到了这个问题,主要是因为我的 Facebook 帐户的隐私已被最大化。

    这很可能是您在登录时传入的权限。默认情况下,它只允许访问公共信息。请记住,Facebook 上公开的信息越来越少。

    尝试将您的权限更改为“read_stream”之类的内容,nil

    然后代替 [_facebook requestWithGraphPath:@"me" andDelegate:self];

    尝试使用 [_facebook requestWithGraphPath:@"me/home" andDelegate:self];

    这应该会返回您的新闻提要。 5 分钟前为我工作。

    【讨论】:

      【解决方案5】:

      这里不多加,在这里也行不通。我使用 iOS SDK 发布到流中,它一直工作到昨天。今天我的客户打电话给我抱怨。呃。

      我已经申请了离线访问权限,当然还有“publish_stream”权限...

      【讨论】:

      • 好的,所以我还强制 isSessionValid 方法返回“YES”,它确实有效。但我绝对不想在我的代码中添加这样的 hack,这可能会在未来搞砸事情。我希望 Facebook 能尽快就这个问题进行沟通。
      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多