Pregunta

Parece que Google ha deshabilitado la vieja manera de enviar SID cookie para sus servicios de datos de Google, específicamente Google Reader.

De esta manera no funciona, al menos, para mí:

//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
};

Y la solicitud:

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"];

Cambio de utilizar el GoogleLogin auth = xxx me da 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"];

El resultado es siempre el código 401 de error. Podría alguien me enseñe a fijar en este caso concreto? Gracias de antemano.

    Error Domain=NSURLErrorDomain Code=401 "Operation could not be completed. (NSURLErrorDomain error 401.)" 
    Error description: Operation could not be completed. (NSURLErrorDomain error 401.)
¿Fue útil?

Solución

Cambio del cuerpo de la POSTAL resuelve el error 401. Las diferencias están en el service, source y continue.

    NSString* content = [NSString stringWithFormat:@"Email=%@&Passwd=%@&service=reader&source=yourapp&continue=http://www.google.com", username, password];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top