我正在尝试为iOS的youtube应用获取访问令牌。这是我在viewDidLoad方法中使用的相关代码:
mAuth = [[GTMOAuth2Authentication alloc]init];
[mAuth setClientID:@"<MY CLIENT ID>"];
[mAuth setClientSecret:@"<MY CLIENT SECRET>"];
[mAuth setRedirectURI:@"urn:ietf:wg:oauth:2.0:oob"];
[mAuth setScope:@"https://gdata.youtube.com"];
[self.web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/auth?client_id=%@&redirect_uri=%@&scope=%@&response_type=code&access_type=offline", mAuth.clientID, mAuth.redirectURI, mAuth.scope]]]];
调用此方法后,用户必须授予对其帐户的访问权限,然后在以下代码中从结果页面中检索身份验证代码:
NSString *string = [self.web stringByEvaluatingJavaScriptFromString:@"document.title"];
if([string rangeOfString:@"Success"].location != NSNotFound){
NSLog(@"This is the code page");
NSString *importantCode = [[string componentsSeparatedByString:@"="] objectAtIndex:1];
NSLog(@"%@", importantCode);
if([self.defaults objectForKey:@"super important code"] == nil){
[self.defaults setObject:importantCode forKey:@"super important code"];
[self.defaults synchronize];
NSString *post = [NSString stringWithFormat:@"code=%@&client_id=%@&client_secret=%@&redirect_uri=%@&grant_type=code", [self.defaults objectForKey:@"super important code"], mAuth.clientID, mAuth.clientSecret, mAuth.redirectURI];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/token"]]];
[request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
[self.web loadRequest:request];
}
[timer invalidate];
}
之后,我应该获得访问令牌以响应我的POST请求,但我得到的页面只是说:
{
"error" : "invalid_request"
}
有没有人(看看我哪里出错了)/(知道如何检索访问令牌)?
答案 0 :(得分:0)
我有兴趣知道HTTP状态代码是什么...我怀疑“invalid_request”意味着400,这几乎总意味着你编写真实URI的方式有一些令人恼火的愚蠢小错误。我不知道iOS / ObcJ是否在任何参数值中正确地URLescaped任何有趣的字符,但它值得检查。或者是其中一个值中的拼写错误,还是一个额外的换行符或什么?
答案 1 :(得分:0)
就像这一样简单,我将grant_type参数设置为'code',如果你正在阅读它并且你正在使用youtube api那么它应该是'authorisation_code',不要犯同样的错误。如果你正在读这个并且你正在发送一个POST请求,那么这个错误“invalid_request”就意味着你要么跳过了你应该添加的参数,要么你添加的错误。