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 を受け取ります。

エラー Domain=NSURLErrorDomain Code=-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];
}

すなわち:

プロジェクトのどこかに次を配置します。

//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 に答える