Facebook oauth/access_token 丢失

Posted

技术标签:

【中文标题】Facebook oauth/access_token 丢失【英文标题】:Facebook oauth/access_token missing 【发布时间】:2010-10-05 08:47:42 【问题描述】:

不知道我是否遗漏了一些东西,但这里有。我试图为我的应用程序获取 access_token,以便它可以在 facebook 上查找某些公共组的事件,而无需用户登录。

我试图从 https://graph.facebook.com/oauth/access_token?client_secret=foobar&client_id=foobar&grant_type=client_credentials&format=json&sdk=ios

这会返回一个字符串:access_token=xxxx|ugtqdoWfvvo5_S-Fo2D7_I4rdbc

这很好,但它没有 json。关于为什么返回的字符串不是 json 编码的任何见解?

注意: 我像这样使用 Facebook ios SDK 功能 [_facebook requestWithGraphpath:@"oauth/access_token" andParams:params andHttpMethod:@"POST" andDelegate:self];

【问题讨论】:

【参考方案1】:

这是一个BUG:https://developers.facebook.com/bugs/325262010847554

Facebook 的 OAuth 2.0 实施明显违反规范:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-25#section-5.1

我正在使用服务器端 Web 应用程序流,并且遇到了您为 iOS SDK 描述的相同问题。

【讨论】:

【参考方案2】:

从图形 api 的 v2.3 开始,此问题已修复。使用端点https://graph.facebook.com/v2.4/oauth/access_token指定版本。 很容易意外地使用错误版本的 facebook API 文档。

【讨论】:

【参考方案3】:

这是一个 sn-p 来提取您的访问令牌并用正确的转义符替换管道字符...

NSURL *accessTokenURL = [NSURL URLWithString:@"https://graph.facebook.com/oauth/access_token?client_id=XXXXXXXXXXXXX&client_secret=XXXXXXXXXXXXXXXXXXX&grant_type=client_credentials"];
NSString *accessTokenResponse = [NSString stringWithContentsOfURL:accessTokenURL encoding:NSUTF8StringEncoding error:NULL];
if(accessTokenResponse != nil) 
    NSMutableString *accessToken = [NSMutableString stringWithString:[accessTokenResponse substringFromIndex:13]];
    [accessToken replaceOccurrencesOfString:@"|" withString:@"%7C" options:NSLiteralSearch range:NSMakeRange(0, [accessToken length])];

【讨论】:

【参考方案4】:

跟进。

我理解 FB ios SDK 的方式是,您的委托函数将接收一个对象,例如 NSArray 或 NSDictionnary 来使用。查看 FB SDK 类的内部结构,似乎所有响应都是使用 SBJSON 解析器解析的。如果响应不是 json,那将失败。

[_facebook requestWithGraphPath:@"261247595170" andDelegate:self]; 返回漂亮的 json。那里没有问题。

[_facebook requestWithGraphPath:@"oauth/access_token" andParams:params andHttpMethod:@"POST" andDelegate:self]; 返回的字符串。 SBJSON 解析器失败。

这似乎是 FB 图形服务中的一个不一致之处。

可以写一个特殊的函数来处理这个问题,但是如果FB决定改变字符串的格式,那么所有的iPhone App都会停止工作,需要更新。不酷。

【讨论】:

【参考方案5】:

如果您使用的是 Facebook SDK,我相信它们会返回 NSArray 和 NSDictionnary

我可能错了,但请尝试使用 objectForKey:@"access_token"

【讨论】:

【参考方案6】:

关于退货原因的任何见解 字符串不是 json 编码的?

是的,访问令牌不应该是 JSON 编码的。无论如何,对单个字符串进行 JSON 编码可以说没有什么价值。

为什么会这样?

我好像被误导了。规范声明 application/json 将用于响应正文。

【讨论】:

所以你是说我们需要编写自己的解析器然后处理响应? 现在我很困惑——你不需要为我知道的任何东西解析访问令牌。你想从解析访问令牌中得到什么? -1 这是错误的。它应该是 JSON 编码的,并且期望基于规范:tools.ietf.org/html/draft-ietf-oauth-v2-25#section-5.1 谢谢,彼得。 FB 违反了他们共同创作的规范,这似乎很奇怪!

以上是关于Facebook oauth/access_token 丢失的主要内容,如果未能解决你的问题,请参考以下文章

Facebook版权问题(不是facebook lite)

Facebook SDK 3.5.1 无法在 Facebook 登录时打开 Facebook 应用

facebook页面无法显示技术性错误

facebook怎么验证?

在 Facebook SDK Android 上找不到文件“com.facebook.android.facebook”

facebook app界面优缺点