Staram się uzyskać token dostępu w Quizlet (oauth2). Wszystko działa bez zarzutu tak daleko, mogę sprawić użytkownikowi przyjęcie mojej aplikacji na Quizlet, przekierowanie, ale podczas żądania tokenu dostępu poprzez NSURLConnection, zawsze pojawia się następujący błąd:Niepoprawny parametr/parametr parametru grant_type w POST dla żądania tokenu dostępu
2013-08-17 09:39:33.422 Abiliator[49549:c07] Returned data in string format: {"http_code":400,"error":"invalid_request","error_title":"Not Allowed","error_description":"Invalid grant_type parameter or parameter missing"}
Oto kod dla uwierzytelniania użytkowników (musi być za pośrednictwem przeglądarki zgodnie ze specyfikacją):
- (void) authenticateQuizletUser
{
NSString *quizletRandomString = [abiliatorAppDelegate GetUUID];
NSString *authURLString = [@"https://quizlet.com/authorize/?response_type=code&client_id=" stringByAppendingString:@"<myID>&scope=read"];
authURLString = [authURLString stringByAppendingString:@"&state="];
authURLString = [authURLString stringByAppendingString:quizletRandomString];
authURLString = [authURLString stringByAppendingString:@"&redirect_uri=Abiliator://after_oauth"];
NSLog(@"Authentication URL sent: %@", authURLString);
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: authURLString]];
}
To działa dobrze, jak już wspomniałem. Aplikacja uruchamia Safari, a użytkownik musi potwierdzić żądanie podania identyfikatora użytkownika i hasła, a serwer przekierowuje do mojej aplikacji, którą przechwytuję w poniższej metodzie, która następnie zgłasza opisany błąd.
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
if (!url) { return NO; }
NSString *URLString = [url absoluteString];
NSLog(@"Received URL: %@", URLString);
NSString *myURLQuery = [url query];
NSString *myAuthCode = [self getAuthorizationCodeFromURL:myURLQuery];
NSLog(@"Component1: %@", myAuthCode);
NSString *authPasswd = @"myPasswd";
NSString *[email protected]"myUserName";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.quizlet.com/oauth/token"]];
request.HTTPMethod = @"POST";
[request setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"Abiliator://after_oauth" forHTTPHeaderField:@"redirect_uri"];
// According to Quizlet API doc: You must set this (grant_type) to the string "authorization_code".
[request setValue:@"authorization_code" forHTTPHeaderField:@"grant_type"];
[request setValue:myAuthCode forHTTPHeaderField:@"code"];
NSString *authStr = [NSString stringWithFormat:@"%@:%@", username, authPasswd];
NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
return YES; }
Każda pomoc jest wysoko ceniona.
Wielkie dzięki. Jeśli chodzi o bezpieczeństwo, przekazuję parametr stanu, zobacz pierwszy kod w moim pytaniu. Po prostu nie zaimplementowałem jeszcze sprawdzania poprawności. Jeśli chodzi o ciało, próbowałem tego samego, tego samego rezultatu. Zaktualizowałem swój post z fragmentem treści, tak jak zaimplementowałem. – renesteg
@renesteg nikt inny nie może zobaczyć twojego wyciętego fragmentu, ponieważ edycja została odrzucona, ale Ty też pominąłeś metodę grant_type, ale wstawiłeś rzeczy, które należą do nagłówka, takie jak typ zawartości i podstawowa autoryzacja. Spróbuj ponownie, używając ciągu, który umieściłem w mojej odpowiedzi. –
Dziwne, że edycje są odrzucane, tak czy inaczej, tutaj snipped używam dla metody body: [bodyData appendData: [postMethodString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [authCodeString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [contentTypeString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [basicAuthorizationString dataUsingEncoding: NSUTF8StringEncoding]]; , a następnie używam [request setHTTPBody: bodyData]; powinno być w porządku, prawda? – renesteg