4

基本的な OAuth インタラクションを機能させようとしましたが、成功しませんでした。確かに、SO にはすでに同様の質問が投げかけられていますが、ほとんどの場合、回答がありません。ここでかなり必死になっているので、コード全体を投稿することから始めます。

// OAuth parameters
NSString *oauthNonce = [self genRandStringLength:20];
NSString *oauthSignatureMethod = [NSString stringWithFormat:@"HMAC-SHA1"];
time_t oauthTimeStamp = (time_t) [[NSDate date] timeIntervalSince1970];

// generate OAuth signature
NSString *encodedUrlString = [self urlEncode:urlString];

NSString *oauthParameters = [NSString stringWithFormat:@"oauth_consumer_key=%@",oauthConsumerKey];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_nonce=%@",oauthNonce];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_signature_method=%@",oauthSignatureMethod];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_timestamp=%d",oauthTimeStamp];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_token=%@",oauthAccessToken];
oauthParameters = [oauthParameters stringByAppendingFormat:@"&oauth_version=1.0"];
NSString *oauthEncodedParameters = [self urlEncode:oauthParameters];

NSString *oauthBaseString = [NSString stringWithFormat:@"GET&%@&%@",encodedUrlString,oauthEncodedParameters];

NSString *oauthKey = [NSString stringWithFormat:@"%@&%@", oauthConsumerSecret, oauthAccessTokenSecret];
NSString *oauthEncodedKey = [self urlEncode:oauthKey];

OAHMAC_SHA1SignatureProvider *provider = [[OAHMAC_SHA1SignatureProvider alloc] init];
NSString *oauthSignature = [provider signClearText:oauthBaseString withSecret:oauthEncodedKey];
NSString *oauthEncodedSignature = [self urlEncode:oauthSignature];

// prepare request
NSString *oauthHeader = @"OAuth ";
oauthHeader = [oauthHeader stringByAppendingFormat:@"oauth_consumer_key=\"%@\"",oauthConsumerKey];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_token=\"%@\"",oauthAccessToken];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature_method=\"%@\"",oauthSignatureMethod];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature=\"%@\"",oauthEncodedSignature];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_timestamp=\"%d\"",oauthTimeStamp];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_nonce=\"%@\"",oauthNonce];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_version=\"1.0\""];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"GET"];
[request setValue:oauthHeader forHTTPHeaderField:@"Authorization"];

NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

http 応答コードを見ると、500 が返されます。予期しない 500 応答について、サービス プロバイダーに問い合わせました。

それまでの間、私が間違っている可能性があることについて何か目立っていますか?

いくつかの実際のサンプル コードを教えていただければ幸いです。私はそこにたくさんのものを読んだことがありますが、明らかにobj-cのニュアンスが間違っています。前もって感謝します。

4

4 に答える 4

4

もし私があなたなら、多くのOAuthWebサービスと統合されているgithubShareKitのソースコードをチェックします。私はそれがあなたにとって特に役立つかもしれないOAuthConsumerを使用していると信じています。OAuthConsumerにはいくつかのドキュメントがあり、アプリケーションに統合してみてください。

OAMutableURLRequestを見ると、OAuthConsumerがどのようにリクエストを作成するかがわかります。ヘッダーがあることを除けば、ヘッダーの設定方法に大きな違いはありませんrealm。私の提案は、OAuthConsumerを使用してリクエストを作成し、それが機能するかどうかを確認することです。それがOAuthConsumerで機能しない場合、問題は他の場所(おそらくサーバー上にあるのでしょうか?)にあると思います。

于 2012-06-23T23:21:45.020 に答える
1

OAuth をいじってからしばらく経ちましたが、PHP と Objective-C の小さなプロジェクトを作成しました。

私の推測では、ヘッダー フィールドはフィールド名で並べ替える必要があるため、順序は次のようになります。

NSString *oauthHeader = @"OAuth ";
oauthHeader = [oauthHeader stringByAppendingFormat:@"oauth_consumer_key=\"%@\"",oauthConsumerKey];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_nonce=\"%@\"",oauthNonce];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_timestamp=\"%d\"",oauthTimeStamp];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_token=\"%@\"",oauthAccessToken];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature=\"%@\"",oauthEncodedSignature];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature_method=\"%@\"",oauthSignatureMethod];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_version=\"1.0\""];

Gitorious for Objective-C の私のuOAuth (micro-OAuth) プロジェクトソースを自由に見てください (見たい場合は、PHP バージョンもあります)。

さらに明確にする必要がある場合は、質問またはコメントへの回答を編集させていただきます。

称賛!

于 2012-06-24T14:17:07.920 に答える
1

ヘッダー フィールドを含む問題があったため、すべてのパラメーターをエンコードされた URL として含めることでそれらを取り除きました。私は次のことをしました。

  • OAuthConsumer-iphone twitter アプリを使用 http://code.google.com/p/oauthconsumer-iphone/
  • OADataFetcher.m の下で -(void)prepare に移動し、oauthheader を取り除き、[request setParameters:[(NSArray *)allParameters urlEncoded]]; を実行して、すべてのパラメーターを URL パラメーターとして含めます。
  • 残りは簡単なはずです。
  • つまり、集中するすべてのファイルは、oauthTwitterAppViewController、OAMutableURLRequest、OADataFetcher、AuthorizeWebViewController です。

これを機能させるために、サービス プロバイダーと同期するのにほぼ 1 週間かかりました。ただし、すべてのソースの準備ができている場合は、おそらく 2 日かかる場合があります。

于 2012-10-30T19:02:17.310 に答える
0

私はあなたのコードを見て、このウェブサイトで他の質問を見た後、最終的に実行中のコードを作成しました. 私の場合、AFHTTPClient を使用してリクエストを開始し、OAMutableURLRequest を使用して Authorization ヘッダーを作成し、Authorization ヘッダーを使用してサーバーに送信するリクエストに添付します。

必要な人のために、ここでコードを共有します。

あなたの場合、サーバーに送信されるリクエストを確認し、Fiddler を使用してテスト リクエストを作成し、サービスをデバッグする必要があると思います。

下手な英語でごめんなさい:p.

NSDictionary * jsonDic;
__block NSString *responsebody = @"";
OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"123"
                                                secret:@"456"];
NSURL *url = [NSURL URLWithString:@"http://MyServiceURL/MyServiceFunction"];

OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
                                                               consumer:consumer
                                                                  token:nil
                                                                  realm:nil
                                                      signatureProvider:nil];
[request prepare];

NSString *oauthHeader = @"OAuth ";
oauthHeader = [oauthHeader stringByAppendingFormat:@"oauth_consumer_key=\"%@\"",@"123"];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_token=\"%@\"",@""];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature_method=\"%@\"",@"HMAC-SHA1"];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature=\"%@\"",encodeToPercentEscapeString(request.signature)];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_timestamp=\"%ld\"", (time_t) [[NSDate date] timeIntervalSince1970]];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_nonce=\"%@\"",request.nonce];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_version=\"1.0\""];
//NSLog(@"oauthHeader: %@", oauthHeader);

[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

NSURL *baseURL = [NSURL URLWithString:@"http://MyServiceURL"];
AFHTTPClient* client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client setParameterEncoding:AFJSONParameterEncoding];
[client setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
[client setDefaultHeader:@"Content-Type" value:@"application/json"];
[client setDefaultHeader:@"Authorization" value:oauthHeader];

NSDictionary *finalDict = @{@"user":@{@"id":@"001"}};
// create a JSON string from your NSDictionary
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalDict options:NSJSONWritingPrettyPrinted error:&error];

[client postPath:@"/MyServiceFunction"
      parameters:finalDict
         success:^(AFHTTPRequestOperation  *operation, id JSON) {
             responsebody = operation.responseString;
             jsonDic = [NSJSONSerialization JSONObjectWithData:[responsebody dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
         }
         failure:^(AFHTTPRequestOperation  *operation, NSError *error) {
             NSLog(@"Hit error: %@", error);
         }];

NSString* encodeToPercentEscapeString(NSString *string) {
return (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                        (CFStringRef) string,
                                        NULL,
                                        (CFStringRef) @"!*'();:@&=+$,/?%#[]",
                                        kCFStringEncodingUTF8));}
于 2013-02-27T04:32:36.333 に答える