我在iPhone Twitter应用中使用OAuth / xAuth,并且包含特殊字符的密码存在问题。例如“密码&”。首先,我正在转换&通过以下方式进入%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代码= -1012 UserInfo = 0x4823e00“操作无法完成。(NSURLErrorDomain错误-1012。)”
我在这里做错了什么?如果我离开&在密码中,它崩溃了我的代码(setParamaters数组丢失了)。有没有人在使用OAuth之前遇到过这个问题?
如果我有一个字母数字密码,一切正常......感谢任何指导!
答案 0 :(得分:0)
OAuthRequestParameter已经对名称和值进行了编码;它可能是&特别是造成问题。您是否尝试过使用不同的非标准字符?可能需要修改OAuth库本身。
答案 1 :(得分:0)
问题是标准OAuth libary使用buggy stringByAddingPercentEscapesUsingEncoding来编码用户名和密码。
我的解决方案是创建一个类别来覆盖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