2

Il semble que Google ait désactivé l'ancien mode d'envoi des cookies SID à leurs services de données Google, en particulier Google Reader.Comment envoyer des demandes authentifiées à Google Reader?

This way ne fonctionne pas au moins pour moi:

//create request 
NSString* content = [NSString stringWithFormat:@"accountType=HOSTED_OR_GOOGLE&Email=%@&Passwd=%@&service=ah&source=myapp", [loginView username].text, [loginView password].text]; 
NSURL* authUrl = [NSURL URLWithString:@"https://www.google.com/accounts/ClientLogin"]; 
NSMutableURLRequest* authRequest = [[NSMutableURLRequest alloc] initWithURL:authUrl]; 
[authRequest setHTTPMethod:@"POST"]; 
[authRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"]; 
[authRequest setHTTPBody:[content dataUsingEncoding:NSASCIIStringEncoding]]; 

NSHTTPURLResponse* authResponse; 
NSError* authError; 
NSData * authData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&authResponse error:&authError];  

NSString *authResponseBody = [[NSString alloc] initWithData:authData encoding:NSASCIIStringEncoding]; 

//loop through response body which is key=value pairs, seperated by \n. The code below is not optimal and certainly error prone. 
NSArray *lines = [authResponseBody componentsSeparatedByString:@"\n"]; 
NSMutableDictionary* token = [NSMutableDictionary dictionary]; 
for (NSString* s in lines) { 
     NSArray* kvpair = [s componentsSeparatedByString:@"="]; 
     if ([kvpair count]>1) 
       [token setObject:[kvpair objectAtIndex:1] forKey:[kvpair objectAtIndex:0]]; 
} 

//if google returned an error in the body [google returns Error=Bad Authentication in the body. which is weird, not sure if they use status codes] 
if ([token objectForKey:@"Error"]) { 
     //handle error 
}; 

Et la demande:

TTURLRequest *request = [TTURLRequest requestWithURL:url delegate:self]; 
request.cachePolicy = cachePolicy; 
request.cacheExpirationAge = TT_CACHE_EXPIRATION_AGE_NEVER; 

NSString *cookieHeader = [NSString stringWithFormat:@"Name=SID;SID=%@;Domain=.google.com;Path=/;Expires=160000000000", sid]; 
[request setValue:cookieHeader forHTTPHeaderField:@"Cookie"]; 

[request setHttpMethod:@"GET"]; 
[request setValue:@"myapp" forHTTPHeaderField:@"User-agent"]; 

Changement d'utiliser le GoogleLogin auth = xxx me donne un NSURLErrorDomain 401

TTURLRequest *request = [TTURLRequest requestWithURL:url delegate:self]; 
request.cachePolicy = cachePolicy; 
request.cacheExpirationAge = TT_CACHE_EXPIRATION_AGE_NEVER; 

NSString *authorizationHeader = [NSString stringWithFormat:@"GoogleLogin auth=%@", auth]; 
[request setValue:authorizationHeader forHTTPHeaderField:@"Authorization"]; 

[request setHttpMethod:@"GET"]; 
[request setValue:@"myapp" forHTTPHeaderField:@"User-agent"]; 

Le résultat est toujours le code d'erreur 401. Quelqu'un pourrait-il me montrer comment réparer dans ce cas précis? Merci d'avance. La modification du corps du POST résout l'erreur 401.

Error Domain=NSURLErrorDomain Code=401 "Operation could not be completed. (NSURLErrorDomain error 401.)" 
    Error description: Operation could not be completed. (NSURLErrorDomain error 401.) 

Répondre

1

Les différences sont dans service, source & continue.

NSString* content = [NSString stringWithFormat:@"Email=%@&Passwd=%@&service=reader&source=yourapp&continue=http://www.google.com", username, password]; 
Questions connexes