使用OAuth获取访问令牌

时间:2012-07-27 22:28:59

标签: iphone objective-c ios ipad oauth

我正试图解决从Instapaper获取访问令牌的OAuth问题,它在他们的网站中说他们不会没有请求令牌/授权工作流程并且他们说这与推特的相似,所以这就是我所做的:

- (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"];
    }
}

1 个答案:

答案 0 :(得分:0)

阅读Instapaper API文档后,您似乎需要在请求中提供令牌。

页面在这里:http://www.instapaper.com/main/request_oauth_consumer_token