1

私は Instapaper からアクセス トークンを取得するという OAuth の問題を回避しようとしています。彼らのサイトには、リクエスト トークン/承認ワークフローはなく、これは twitter とかなり似ていると書かれています。私がしたこと:

- (void)getXAuthAccessToken
{
    OAConsumer *consumer = [[[OAConsumer alloc] initWithKey:CONSUMER_KEY secret:CONSUMER_SECRET] autorelease];

    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:[NSURL URLWithString:INSTAPAPER_CLIENT_OAUTH_URL]
                                                                   consumer:consumer
                                                                      token:nil // xAuth needs no request token?
                                                                      realm:nil   // our service provider doesn't specify a realm
                                                          signatureProvider:nil]; // use the default method, HMAC-SHA1

    [request setHTTPMethod:@"POST"];

    [request setParameters:[NSArray arrayWithObjects:
                            [OARequestParameter requestParameterWithName:@"x_auth_mode" value:@"client_auth"],
                            [OARequestParameter requestParameterWithName:@"x_auth_username" value:self.username],
                            [OARequestParameter requestParameterWithName:@"x_auth_password" value:self.password],
                            nil]];      


     [request prepare];
    AFHTTPRequestOperation *requestOAuth = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [requestOAuth setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
        NSLog(@"RESPONSE OBJECT IS %@", responseObject);
    }failure:^(AFHTTPRequestOperation *operation, NSError *error){
        NSLog(@"ERROR IS %@", error);
    }];

    [requestOAuth start];

}

なぜこれが常に私に401を与えているのか分かりますか?

したがって、最初にこのリクエストで準備を呼び出す必要があることがわかりました。しかし、その後、responseData を読み返すことができず、現在はバイナリにすぎません。これを人間が読める形式に変換するにはどうすればよいですか?

編集:

パラメータを設定すると、パラメータがヘッダーに配置されます。

- (void)setParameters:(NSArray *)parameters 
{
    NSMutableString *encodedParameterPairs = [NSMutableString stringWithCapacity:256];

    int position = 1;
    for (OARequestParameter *requestParameter in parameters) 
    {
        [encodedParameterPairs appendString:[requestParameter URLEncodedNameValuePair]];
        if (position < [parameters count])
            [encodedParameterPairs appendString:@"&"];

        position++;
    }

    if ([[self HTTPMethod] isEqualToString:@"GET"] || [[self HTTPMethod] isEqualToString:@"DELETE"])
        [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", [[self URL] URLStringWithoutQuery], encodedParameterPairs]]];
    else 
    {
        // POST, PUT
        NSData *postData = [encodedParameterPairs dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
        [self setHTTPBody:postData];
        [self setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
        [self setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    }
}
4

1 に答える 1

0

Instapaper APIのドキュメントを読んだ後、リクエストでトークンを提供する必要があるようです。

ページはここにあります:http://www.instapaper.com/main/request_oauth_consumer_token

于 2012-07-27T22:38:49.303 に答える