无法从iOS OAuth1.0,OAC消费者客户端的tumblr上发布

我正在尝试将“tumblr”集成到我的应用程序中。我能够成功获取访问令牌。 但是,当我尝试发布,我收到以下错误

{"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

我正在使用iOS的OAuthConsumer客户端,如果来自MGTwitterEngine ,我已经将其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 

我在这里犯的错误是什么? 为什么我得到这个错误? 我是否正确地执行了这些步骤?

请XXX出你的consumer_key和consumer_secret,以避免不必要的使用它们。 明智的代码有几件事你可能想在这里找。

  1. 您是否可以使用“ http://api.tumblr.com/v2/user/info ”这样的oauth'GET'请求? 如果您可以收到一个成功的“GET”请求,那么您的访问令牌是有效的,你可以看看你如何发送你的职位参数。

  2. 确保你传递的参数是HTTP Body以及签名参数。 图书馆可能会提供正确的参数sorting。

    NSString * postbody = @“body = myBodyText&type = text”;

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