无法通过iOS OAuth1.0的OAConsumer客户端在tumblr上发布内容

6
我正在尝试将“tumblr”集成到我的应用程序中。我已成功获取访问令牌。但是,当我尝试发布时,出现以下错误。
{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}

我正在使用iOS的OAuthConsumer客户端,它是从MGTwitterEngine中获取的。

这是我尝试过的内容。

#import "ViewController.h"


#define consumer_key  @"u9iZvT8KIlrTtUrh3vUeXXXXXXXXXXXXXAfgpThGyom8Y6MKKCnU"
#define consumer_secret  @"xfA10mQKmALlpsnrFXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define request_token_url  @"http://www.tumblr.com/oauth/request_token"
#define access_token_url  @"http://www.tumblr.com/oauth/access_token"
#define authorize_url  @"http://www.tumblr.com/oauth/authorize?oauth_token=%@"
#define base_url @"http://api.tumblr.com/v2/user/XXXXXXXXXXXXX.tumblr.com/info"
#define user_info @"http://api.tumblr.com/v2/user/info"

@interface ViewController ()

@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
}




- (IBAction)postIt:(id)sender
{

    NSURL *postURL = [NSURL URLWithString:@"http://api.tumblr.com/v2/blog/xxxxxxxx.tumblr.com/post"];
    OAMutableURLRequest *oRequest = [[OAMutableURLRequest alloc] initWithURL:postURL
                                                                    consumer:self.consumer
                                                                       token:self.accessToken
                                                                       realm:nil
                                                           signatureProvider:nil];
    [oRequest setHTTPMethod:@"POST"];

    [oRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    OARequestParameter *statusParam = [[OARequestParameter alloc] initWithName:@"body"
                                                                         value:@"Sample Body"];
    OARequestParameter *statusParam2 = [[OARequestParameter alloc] initWithName:@"type"
                                                                         value:@"text"];

    NSArray *params = [NSArray arrayWithObjects:statusParam,statusParam2, nil];
    [oRequest setParameters:params];
    OAAsynchronousDataFetcher *fetcher = [OAAsynchronousDataFetcher asynchronousFetcherWithRequest:oRequest
                                                                                          delegate:self
                                                                                 didFinishSelector:@selector(sendStatusTicket:didFinishWithData:)
                                                                                   didFailSelector:@selector(sendStatusTicket:didFailWithError:)];
    NSLog(@"URL = %@",[oRequest.URL absoluteString]);

    [fetcher start];
}


- (void)didReceiveAccessToken:(OAServiceTicket *)ticker data:(NSData *)responseData
{


}

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error {
    // ERROR!
}




- (void)sendStatusTicket:(OAServiceTicket *)ticker didFinishWithData:(NSData *)responseData
{
    if (ticker.didSucceed) {
        NSLog(@"Success");
    }
    NSString *responseBody = [[NSString alloc] initWithData:responseData
                                                   encoding:NSUTF8StringEncoding];

    NSLog(@"Description = %@",responseBody);


}
- (void)sendStatusTicket:(OAServiceTicket *)ticker didFailWithError:(NSError *)error
{
    NSLog(@"Error = %@",[error localizedDescription]);
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (IBAction)login:(id)sender
{
    self.consumer = [[OAConsumer alloc] initWithKey:consumer_key secret:consumer_secret];

    NSURL *url = [NSURL URLWithString:request_token_url];


    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
                                                                   consumer:self.consumer
                                                                      token:nil   // we don't have a Token yet
                                                                      realm:nil   // our service provider doesn't specify a realm
                                                          signatureProvider:nil]; // use the default method, HMAC-SHA1

    [request setHTTPMethod:@"POST"];

    OADataFetcher *fetcher = [[OADataFetcher alloc] init];

    [fetcher fetchDataWithRequest:request
                         delegate:self
                didFinishSelector:@selector(requestTokenTicket:didFinishWithData:)
                  didFailSelector:@selector(requestTokenTicket:didFailWithError:)];


}
- (void)requestTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data {
    if (ticket.didSucceed)
    {
        NSString *responseBody = [[NSString alloc] initWithData:data
                                                       encoding:NSUTF8StringEncoding];
        self.accessToken= [[OAToken alloc] initWithHTTPResponseBody:responseBody];

        NSURL *author_url = [NSURL URLWithString:[ NSString stringWithFormat:authorize_url,self.accessToken.key]];
        OAMutableURLRequest  *oaR = [[OAMutableURLRequest alloc] initWithURL:author_url consumer:nil token:nil realm:nil signatureProvider:nil];        
        UIWebView  *webView =[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        [[[UIApplication sharedApplication] keyWindow] addSubview:webView];
        webView.delegate=self;
        [webView loadRequest:oaR];

    }
}

// This is to get oAuth_verifier from the url

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {

    NSString *url = [[request URL] absoluteString];
    NSString *keyOne = @"oauth_token";
    NSString *keyTwo = @"oauth_verifier";
    NSRange r1 =[url rangeOfString:keyOne];
    NSRange r2 =[url rangeOfString:keyTwo];
    if (r1.location!=NSNotFound && r2.location!=NSNotFound) {
        // Extract oauth_verifier from URL query
        NSString* verifier = nil;
        NSArray* urlParams = [[[request URL] query] componentsSeparatedByString:@"&"];
        for (NSString* param in urlParams) {
            NSArray* keyValue = [param componentsSeparatedByString:@"="];
            NSString* key = [keyValue objectAtIndex:0];
            if ([key isEqualToString:@"oauth_verifier"]) {
                verifier = [keyValue objectAtIndex:1];
                break;
            }
        }
        if (verifier) {
            NSURL* accessTokenUrl = [NSURL URLWithString:@"http://www.tumblr.com/oauth/access_token"];
            OAMutableURLRequest* accessTokenRequest =[[OAMutableURLRequest alloc] initWithURL:accessTokenUrl
                                                                                     consumer:self.consumer
                                                                                        token:self.accessToken
                                                                                        realm:nil
                                                                            signatureProvider:nil];
            OARequestParameter* verifierParam =[[OARequestParameter alloc] initWithName:@"oauth_verifier" value:verifier];
            [accessTokenRequest setHTTPMethod:@"POST"];
            [accessTokenRequest setParameters:[NSArray arrayWithObjects:verifierParam,nil]];
            OADataFetcher* dataFetcher = [[OADataFetcher alloc] init];
            [dataFetcher fetchDataWithRequest:accessTokenRequest
                                     delegate:self
                            didFinishSelector:@selector(requestTokenTicketForAuthorization:didFinishWithData:)
                              didFailSelector:@selector(requestTokenTicket:didFailWithError:)];
        } else {
            // ERROR!
        }
        [webView removeFromSuperview];
        return NO;
    }
    return YES;
}


- (void)requestTokenTicketForAuthorization:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data
{
    if (ticket.didSucceed)
    {
        NSString *responseBody = [[NSString alloc] initWithData:data
                                                       encoding:NSUTF8StringEncoding];
        self.accessToken = [self.accessToken initWithHTTPResponseBody:responseBody];
        accessText=self.accessToken.key;
        accessSecret=self.accessToken.secret;
    }
    else
    {
        NSString *responseBody = [[NSString alloc] initWithData:data
                                                       encoding:NSUTF8StringEncoding];
        NSLog(@"Response = %@",responseBody);
    }


}
- (void)requestTokenTicket:(OAServiceTicket *)ticket didFailWithError:(NSError *)error
{
    NSLog(@"Error = %@",[error localizedDescription]);
}


@end

我这里犯了什么错误?为什么会出现那个错误?我有正确遵循步骤吗?

1个回答

3
请将您的consumer_key和consumer_secret标记为XXX,以避免不必要的使用。关于代码方面,这里有一些事情您可能需要注意:
  1. 您能否使用oauth的“GET”请求,例如“http://api.tumblr.com/v2/user/info”? 如果您可以接收成功的“GET”请求,则您的访问令牌是有效的,您可以查看如何发送您的帖子参数。

  2. 确保您将参数作为HTTP Body以及签名参数传递。正确的参数排序可能由库提供。

    NSString *postbody = @"body=myBodyText&type=text";

    [oRequest setHTTPBody:[postbody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:TRUE]];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接