获取 YouTube API iOS 的访问令牌“错误”:“invalid_request”

问题描述 投票:0回答:2

我正在尝试获取 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"
}

有人(看看我哪里出错了)/(知道如何检索访问令牌)吗?

ios objective-c youtube google-oauth
2个回答
0
投票

我有兴趣知道 HTTP 状态代码是什么...我怀疑“invalid_request”意味着 400,这几乎总是意味着您在编写身份验证 URI 的方式中存在一些令人恼火的愚蠢小错误。 我对 iOS/ObcJ 的了解不够多,无法判断您是否已正确对任何参数值中的任何有趣字符进行 URL 转义,但值得检查。 或者其中一个值出现拼写错误,或者出现额外的换行符之类的?


0
投票

就这么简单,我将 grant_type 参数设置为“code”,而它本应是“authorization_code”,如果您正在阅读本文并且正在使用 youtube api,请不要犯同样的错误。如果您正在阅读本文并且通常发送 POST 请求,则此错误“invalid_request”意味着您跳过了应该添加的参数之一,或者添加了错误的参数。

© www.soinside.com 2019 - 2024. All rights reserved.