2010-10-05 82 views
7

不知道如果我缺少一些東西,但在這裏。我試着去得到的access_token我的應用程序,以便它可以去查找在Facebook上特定的公共組事件,而不需要用戶先登錄。Facebook oauth/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

這會返回一個字符串:=的access_token XXXX | ugtqdoWfvvo5_S-Fo2D7_I4rdbc

這就是很好的和所有,但它沒有JSON。關於爲什麼返回的字符串不是json編碼的任何見解?

注: 林使用Facebook IOS SDK函數像這樣 [_facebook requestWithGraphPath:@ 「的OAuth/ACCESS_TOKEN」 andParams:PARAMS andHttpMethod:@ 「POST」 andDelegate:自];

回答

-1

有關爲什麼返回的 字符串未被json編碼的任何見解?

是的,訪問令牌不應該是JSON編碼的。無論如何,在JSON編碼單個字符串方面可以說沒有什麼價值。

你爲什麼期待它如此呢?

似乎我誤解了這一點。規範指出應用程序/ json將用於響應主體。

+0

所以你說我們需要編寫我們自己的解析器然後處理響應? – 2010-10-06 15:21:50

+0

現在我很困惑 - 你不需要爲我知道的任何東西解析訪問令牌。你想從解析訪問令牌中解脫出來? – 2010-10-06 16:01:18

+1

-1這是錯誤的。它本身應該是JSON編碼的,並且期望基於以下規範:http://tools.ietf.org/html/draft-ietf-oauth-v2-25#section-5.1 – jkoreska 2012-04-27 00:44:39

-1

如果您正在使用Facebook的SDK,我相信他們返回的NSArray和NSDictionnary

我可能是錯的,但是有一個objectForKey:@"access_token"

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應用程序都將停止工作,並且需要更新。不酷。

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])]; 
}