Проблема с OADataFetcher на iPhone при использовании URL-кодированных строк - PullRequest
1 голос
/ 02 марта 2010

Я использую OAuth / xAuth в приложении для Twitter на iPhone, и у меня проблема с паролями, содержащими специальные символы. Например, «пароль &». Прежде всего, я конвертирую & в% 26, выполнив:

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

Это прекрасно кодирует в "пароль% 26". Затем я настраиваю его в качестве параметра 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]];

При отправке запроса с использованием OADataFetcher я получаю NSUrlError:

Ошибка домена = NSURLErrorDomain Code = -1012 UserInfo = 0x4823e00 "Операция не может быть завершена. (NSURLErrorDomain ошибка -1012.)"

Что я здесь не так делаю? Если я оставлю & в пароле, он разрушит мой код (массив setParamaters вылетит). Кто-нибудь сталкивался с этим перед использованием OAuth?

Если у меня есть буквенно-цифровой пароль, все работает нормально ... Спасибо за любые рекомендации!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2010

Проблема в том, что в стандартной библиотеке OAuth используется ошибочная строкаByAddingPercentEscapesUsingEncoding для кодирования имени пользователя и пароля.

Моим решением было создать категорию для переопределения следующих методов в OARequestParameter

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

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

т.е:

Поместите в ваш проект следующее:

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

@interface OARequestParameter (YourApp)

@end

и переопределить ошибочные методы с помощью:

#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
0 голосов
/ 02 марта 2010

OAuthRequestParameter уже кодирует имя и значение; может быть, что & в частности вызывает проблемы. Вы пробовали использовать разные нестандартные символы? Возможно, потребуется изменить саму библиотеку OAuth.

...