Non riesco a ottenere il token di accesso su Quizlet (oauth2). Tutto funziona bene fino ad ora, posso fare l'utente ad accettare il mio app sul Quizlet, ottenere reindirizzato, ma quando si richiede il token di accesso via NSURLConnection, ho sempre arrivare il seguente errore:Parametro grant_type non valido o parametro mancante su POST per la richiesta di token di accesso
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"}
Ecco il codice per l'autenticazione degli utenti (deve essere via browser secondo le specifiche):
- (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]];
}
Che funziona bene, come ho detto. L'app avvia Safari e l'utente deve confermare la richiesta immettendo l'id utente e la password e il server reindirizza nella mia app, che catturo nel metodo seguente, che quindi genera l'errore descritto.
- (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; }
Qualsiasi aiuto apprezzato molto.
Grazie mille. Per quanto riguarda la sicurezza, passo il parametro state, vedi il primo codice nella mia domanda. Non ho ancora implementato il controllo di validazione. Per quanto riguarda il corpo, ho provato anche questo, lo stesso risultato. Ho aggiornato il mio post con lo snippet del corpo come ho implementato. – renesteg
@renesteg nessun altro può vedere il tuo snippato perché la modifica è stata rifiutata, ma anche tu hai omesso il grant_type ma hai inserito invece le cose che appartengono all'intestazione come il tipo di contenuto e l'autorizzazione di base. Si prega di riprovare con la stringa che ho inserito nella mia risposta. –
strano che le modifiche vengano rifiutate, in ogni caso, qui lo snippato che utilizzo per il metodo body: [bodyData appendData: [postMethodString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [authCodeString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [contentTypeString dataUsingEncoding: NSUTF8StringEncoding]]; [bodyData appendData: [basicAuthorizationString dataUsingEncoding: NSUTF8StringEncoding]]; e poi io uso [request setHTTPBody: bodyData]; dovrebbe andare bene, giusto? – renesteg