我试图从中获取access_token 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];
答案 0 :(得分:5)
这是 BUG :https://developers.facebook.com/bugs/325262010847554
Facebook的OAuth 2.0实施显然违反了规范:http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-5.1
我正在使用服务器端Web应用程序流,并且您遇到了与iOS SDK相同的问题。
答案 1 :(得分:2)
从图api的v2.3开始修复。使用端点https://graph.facebook.com/v2.4/oauth/access_token指定版本 很容易意外地登陆错误版本的facebook API文档。
答案 2 :(得分:1)
这是一个片段,用于提取您的访问令牌并使用正确的转义符替换管道符...
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])];
}
答案 3 :(得分:0)
跟进。
我理解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应用程序都将停止工作,并需要更新。不酷。
答案 4 :(得分:-1)
任何有关返回原因的见解 string不是json编码的?
是的,访问令牌不应该是JSON编码的。无论如何,JSON编码单个字符串的价值可能很小。
你为什么期待它呢?
似乎我对此误导了。规范声明application / json将用于响应主体。
答案 5 :(得分:-1)
如果您使用的是Facebook SDK,我相信它们会返回NSArray和NSDictionary
我可能错了,但请尝试使用objectForKey:@"access_token"