0

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"
}

誰か(私がどこで間違ったのかを見てください)/(アクセストークンを取得する方法を知っていますか)?

4

2 に答える 2

0

HTTP ステータス コードが何であるかを知りたいと思います...「invalid_request」は 400 を意味すると思われます。これは、ほとんどの場合、認証 URI を構成する方法に腹立たしい愚かな小さなエラーがあることを意味します。パラメータ値の変な文字を適切に URL エスケープしたかどうかを判断するのに十分な iOS/ObcJ はわかりませんが、確認する価値はあります。または、値の 1 つのタイプミス、または余分な改行が忍び寄っていますか?

于 2013-11-17T05:36:18.007 に答える
0

これと同じくらい簡単でした。これを読んでいてYouTube APIを使用している場合は、grant_typeパラメーターを「code」にする必要があるのに「code」に設定しました。同じ間違いをしないでください。これを読んでいて、一般的に POST リクエストを送信している場合、このエラー「invalid_request」は、追加すべきパラメータの 1 つをスキップしたか、間違って追加したことを意味します。

于 2013-11-19T22:30:23.937 に答える