1

我在 iPhone twitter 应用程序中使用 OAuth/xAuth,并且遇到了包含特殊字符的密码问题。例如“密码&”。首先,我通过执行以下操作将 & 转换为 %26:

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

这会将其编码为“password%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 之前遇到过这个问题?

如果我有一个字母数字密码,一切正常...感谢您的指导!

4

2 回答 2

0

问题是标准 OAuth 库使用错误的 stringByAddingPercentEscapesUsingEncoding 对用户名和密码进行编码。

我的解决方案是创建一个类别来覆盖 OARequestParameter 中的以下方法

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

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

IE:

将以下内容放在项目中的某个位置:

//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
于 2010-12-07T01:34:57.713 回答
0

OAuthRequestParameter 已经对名称和值进行了编码;可能是 & 特别是导致问题。您是否尝试过使用不同的非标准字符?它可能需要修改 OAuth 库本身。

于 2010-03-02T15:17:27.563 回答