2010-03-02 12 views
1

J'utilise OAuth/xAuth dans une application iPhone pour iPhone et je rencontre un problème avec les mots de passe contenant des caractères spéciaux. Par exemple "mot de passe &". Tout d'abord, je suis en train de convertir le & en% 26 en faisant:Problème avec OADataFetcher sur iPhone lors de l'utilisation de chaînes codées en URL

NSString *encodedPassword = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                       NULL, 
                       (CFStringRef)thePassword, 
                       NULL, 
                       (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                       kCFStringEncodingUTF8); 

Ce code il bien en « mot de passe% 26 ». Je suis alors mise en place en tant que paramètre d'un OAMutableURLRequest:

[request setParameters:[NSArray arrayWithObjects: 
         [OARequestParameter requestParameterWithName:@"x_auth_mode" value:@"client_auth"], 
         [OARequestParameter requestParameterWithName:@"x_auth_username" value:encodedUsername], 
         [OARequestParameter requestParameterWithName:@"x_auth_password" value:encodedPassword], 
         nil]]; 

Lors de l'envoi de la demande à l'aide d'un OADataFetcher, je reçois un NSUrlError:

Error Domain=NSURLErrorDomain Code=-1012 UserInfo=0x4823e00 "Operation could not be completed. (NSURLErrorDomain error -1012.)"

ce que je fais mal ici? Si je laisse le & dans le mot de passe, il bloque mon code (le tableau de bord setParamaters s'arrête). Quelqu'un at-il rencontré cela avant d'utiliser OAuth?

Si j'ai un mot de passe alphanumérique tout fonctionne bien ... Merci pour tout conseil!

Répondre

0

OAuthRequestParameter code déjà le nom et la valeur; il se peut que le & en particulier cause des problèmes. Avez-vous essayé d'utiliser différents caractères non standard? Il peut être nécessaire de modifier la bibliothèque OAuth elle-même.

0

Le problème est que la librairie OAuth standard utilise le buggy stringByAddingPercentEscapesUsingEncoding pour encoder le nom d'utilisateur et le mot de passe.

Ma solution était de faire une catégorie pour remplacer les méthodes suivantes dans OARequestParameter

- (NSString *)URLEncodedName 
{ 
return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
} 

- (NSString *)URLEncodedValue 
{ 
    return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
} 

-à-dire:

Mettez les suivantes quelque part dans votre projet:

//the .h file 
#import "OARequestParameter.h" 

@interface OARequestParameter (YourApp) 

@end 

et passer outre le buggy méthodes avec:

#import "OARequestParameter+YourApp.h" 


@implementation OARequestParameter (YourApp) 

-(NSString*)encode:(NSString*)unencodedString 
{ 
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
         NULL, 
         (CFStringRef)unencodedString, 
         NULL, 
         (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
         kCFStringEncodingUTF8); 
return [encodedString autorelease]; 
} 

- (NSString *)URLEncodedName 
{ 
//return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
return [self encode:self.name]; 
} 

- (NSString *)URLEncodedValue 
{ 
    //return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
return [self encode:self.value]; 
} 

@end