现在的位置: 首页 > 综合 > 正文

新浪微博OAUTH方法

2013年09月20日 ⁄ 综合 ⁄ 共 9978字 ⁄ 字号 评论关闭

 1, 在第一步获取Request Token时,需要使用Consumer Key和API Key Secret进行签名 的Consumer Key Secret。

方法:oauth/request_token


获取request_token之后,要做一件事情,就是让用户登录,调出新浪微博登录页面:
- (NSString*)authorizeUrl{

    //

    NSString *baseUrl = [NSString stringWithFormat:@"http://%@/oauth/authorize", SINA_T_HOST];

    NSString *url = [NSString stringWithFormat:@"%@?oauth_token=%@&oauth_token_secret=%@&oauth_callback%@", baseUrl, self.oauth_token, self.oauth_token_secret, @"oob"];

    return url;

}


oauth_token 和oauth_token_secret是第一步的请求返回的。

登录完,用户授权后,会生成一个授权码,这个授权码在下一步获取access token的时候使用,就是下面的参数pin。


2, 在第二步换取Access Token时,需要使用Consumer Key,API Key Secret、Request Token和Request Token Secret进行签名。而Request Token和Request Token Secret对应签名中的Token和Token Secret 

方法:oauth/access_token


举例:
#define SINA_T_HOST                            @"api.t.sina.com.cn"//api.t.sina.com.cn

#define SINA_WEIBO_APP_KEY            @"你的Consumer Key"

#define SECRET                                      @"你的API Key Secret"


#define OAUTH_VERSION                              @"1.0"

#define OAUTH_SIGNATURE_METHOD        @"HMAC-SHA1"


获取Request Token
- (BOOL)getRequestToken{

    BOOL bRes = NO;

    self.uploadPool = [[NSAutoreleasePool alloc] init];

    self.characterBuffer = [NSMutableData data];

    done = NO;

    [[NSURLCache sharedURLCache] removeAllCachedResponses];

    

    NSString *baseUrl = [NSString stringWithFormat:@"http://%@/oauth/request_token", SINA_T_HOST];

    

    CFUUIDRef theUUID = CFUUIDCreate(NULL);

    CFStringRef string = CFUUIDCreateString(NULL, theUUID);

    CFRelease(theUUID);

    NSString *nonce = [(NSString*)string copy];

    CFRelease(string);

    

    NSString * timestamp = [NSString stringWithFormat:@"%0.0f",[[NSDate date] timeIntervalSince1970]];

    

    

    NSMutableDictionary* info = [NSMutableDictionary dictionaryWithObjectsAndKeys:SINA_WEIBO_APP_KEY,@"oauth_consumer_key",

                                 OAUTH_SIGNATURE_METHOD,@"oauth_signature_method",

                                 timestamp,@"oauth_timestamp",

                                 nonce,@"oauth_nonce",

                                 OAUTH_VERSION,@"oauth_version",nil];

    

    NSString* url = hmac_sha1_signature(@"GET", baseUrl, info, @"");

    

    NSLog(@"%@", url);

    

    

    NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm=\"%@\", oauth_consumer_key=\"%@\", oauth_signature_method=\"%@\", oauth_signature=\"%@\", oauth_timestamp=\"%@\", oauth_nonce=\"%@\", oauth_version=\"1.0\"",

                             @"",

                             [info valueForKey:@"oauth_consumer_key"],

                             [info valueForKey:@"oauth_signature_method"],

                             [info valueForKey:@"oauth_signature"],

                             [info valueForKey:@"oauth_timestamp"],

                             [info valueForKey:@"oauth_nonce"]];

   
 //NSLog(@"oauthHeader: %@", oauthHeader);

    

    

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];

    [theRequest setHTTPMethod:@"GET"];

    [theRequest setValue:oauthHeader forHTTPHeaderField:@"Authorization"];

    

    connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    [self performSelectorOnMainThread:@selector(httpConnectStart) withObject:nil waitUntilDone:NO];

    if (connection != nil) {

        do {

            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

        } while (!done);

    }

    

    NSString *stringData = [[NSString alloc] initWithData: characterBuffer encoding: NSUTF8StringEncoding];

    NSLog(@"%@",stringData);

    

    //oauth_token=43dd8e6574fc1d1e1c5ae4ecf534b763&oauth_token_secret=015c39cad2c0bf264c8b46896f5d5f98

    NSRange range = [stringData rangeOfString:@"oauth_token"];

    NSRange rangeSecret = [stringData rangeOfString:@"oauth_token_secret"];

    

    if(range.location != NSNotFound && rangeSecret.location != NSNotFound){

        

        NSArray *sep = [stringData componentsSeparatedByString:@"&"];

        if([sep count] >= 2){

            

            NSArray *sep1 = [[sep objectAtIndex:0] componentsSeparatedByString:@"="];

            if([sep1 count] >= 2){

                self.oauth_token = [sep1 objectAtIndex:1];

                bRes = YES;

            }

            NSArray *sep2 = [[sep objectAtIndex:1] componentsSeparatedByString:@"="];

            if([sep2 count] >= 2){

                self.oauth_token_secret = [sep2 objectAtIndex:1];

                bRes = YES;

            }

            

        }

    }

    

    [stringData release];

    

    if(bRes){

        [self.tSinaInfo_ setObject:self.oauth_token forKey:@"oauth_token"];

        [self.tSinaInfo_ setObject:self.oauth_token_secret forKey:@"oauth_token_secret"];

        [self saveInformation];

    }

    

 
   // Release resources used only in this thread.

    self.connection = nil;

    [uploadPool release];

    self.uploadPool = nil;

    

    return bRes;

}


获取Access Token
- (BOOL)getAccessToken{

    BOOL bRes = NO;

    self.uploadPool = [[NSAutoreleasePool alloc] init];

    self.characterBuffer = [NSMutableData data];

    done = NO;

    [[NSURLCache sharedURLCache] removeAllCachedResponses];

    

    NSString *baseUrl = [NSString stringWithFormat:@"http://%@/oauth/access_token", SINA_T_HOST];

    

    CFUUIDRef theUUID = CFUUIDCreate(NULL);

    CFStringRef string = CFUUIDCreateString(NULL, theUUID);

    CFRelease(theUUID);

    NSString *nonce = [(NSString*)string copy];

    CFRelease(string);

    

    NSString * timestamp = [NSString stringWithFormat:@"%0.0f",[[NSDate date] timeIntervalSince1970]];

    

    

    NSMutableDictionary* info = [NSMutableDictionary dictionaryWithObjectsAndKeys:SINA_WEIBO_APP_KEY,@"oauth_consumer_key",

                                 OAUTH_SIGNATURE_METHOD,@"oauth_signature_method",

                                 timestamp,@"oauth_timestamp",

                                 nonce,@"oauth_nonce",

                                 self.oauth_token,@"oauth_token",

                                 self.pin,@"oauth_verifier",

                                 OAUTH_VERSION,@"oauth_version",nil];

    

    hmac_sha1_signature(@"GET", baseUrl, info, self.oauth_token_secret);

    

  
  //NSLog(@"%@", url);

    

    

    NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm=\"%@\", oauth_consumer_key=\"%@\", oauth_token=\"%@\", oauth_signature_method=\"%@\", oauth_signature=\"%@\", oauth_timestamp=\"%@\",oauth_verifier=\"%@\", oauth_nonce=\"%@\", oauth_version=\"1.0\"",

                             @"",

                             [info valueForKey:@"oauth_consumer_key"],

                             [info valueForKey:@"oauth_token"],

                             [info valueForKey:@"oauth_signature_method"],

                             [info valueForKey:@"oauth_signature"],

                             [info valueForKey:@"oauth_timestamp"],

                             [info valueForKey:@"oauth_verifier"], //授权码

                             [info valueForKey:@"oauth_nonce"]];
   // NSLog(@"oauthHeader: %@", oauthHeader);

    

    

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];

    [theRequest setHTTPMethod:@"GET"];

    [theRequest setValue:oauthHeader forHTTPHeaderField:@"Authorization"];

    

    connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    [self performSelectorOnMainThread:@selector(httpConnectStart) withObject:nil waitUntilDone:NO];

    if (connection != nil) {

        do {

            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

        } while (!done);

    }

    

    NSString *stringData = [[NSString alloc] initWithData: characterBuffer encoding: NSUTF8StringEncoding];
    //NSLog(@"%@",stringData);

    

    NSRange range = [stringData rangeOfString:@"oauth_token"];

    NSRange rangeSecret = [stringData rangeOfString:@"oauth_token_secret"];

    

    if(range.location != NSNotFound && rangeSecret.location != NSNotFound){

        

        NSArray *sep = [stringData componentsSeparatedByString:@"&"];

        if([sep count] >= 2){

            

            NSArray *sep1 = [[sep objectAtIndex:0] componentsSeparatedByString:@"="];

            if([sep1 count] >= 2){

                self.access_token = [sep1 objectAtIndex:1];

                bRes = YES;

            }

            NSArray *sep2 = [[sep objectAtIndex:1] componentsSeparatedByString:@"="];

            if([sep2 count] >= 2){

                self.access_token_secret = [sep2 objectAtIndex:1];

                bRes = YES;

            }

            

        }

    }

    

    if(bRes){

        [self.tSinaInfo_ setObject:self.access_token forKey:@"access_token"];

        [self.tSinaInfo_ setObject:self.access_token_secret forKey:@"access_token_secret"];

        [self saveInformation];

    }

    

    [stringData release];

    

    

    // Release resources used only in this thread.

    self.connection = nil;

    [uploadPool release];

    self.uploadPool = nil;

    

    return bRes;

}


签名函数: hmac_sha1_signature


 NSString* hmac_sha1_signature(NSString* method, NSString* baseUrl, NSDictionary*param, NSString* token_secret) {

    

    NSArray *sortedkeys = [[param allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    NSMutableString *mutUrlParam = [NSMutableString stringWithString:@""];

    

    unsigned i, c = [sortedkeys count];

    for (i=0; i<c; i++) {

        NSString *k=[sortedkeys objectAtIndex:i];

        NSString *v=[param objectForKey:k];

        if(i>0){

            [mutUrlParam appendString:@"&"];

        }

        [mutUrlParam appendString:k];

        [mutUrlParam appendString:@"="];

        [mutUrlParam appendString:[URICode escapeURIComponent:v]];// URI 编码

    }

    

    NSString *urlEncodeBaseUrl = [URICode escapeURIComponent:baseUrl]; // URI 编码

    NSString *urlParam = (NSString*)mutUrlParam;

    urlParam = [URICode escapeURIComponent:urlParam]; // URI 编码

    

    
//1.generate Signature BaseString

    NSString *sbs = [NSString stringWithFormat:@"%@&%@&%@", method, urlEncodeBaseUrl, urlParam];

    
    //NSLog(@"%@", sbs);

    

    NSString *key = [NSString stringWithFormat:@"%@&%@",SECRET, token_secret];

    

    NSString *oauth_signature = [SHA1 hmac_sha1:key text:sbs];

    

    [param setValue:oauth_signature forKey:@"oauth_signature"];

    

  
  //oauth_signature = [URICode escapeURIComponent:oauth_signature];

    

    //NSLog(@"oauth_signature = %@", oauth_signature);

    

    NSMutableString *urlParams = [NSMutableString stringWithString:@""];

    NSArray *keys=[param allKeys];

    i, c=[keys count];

    for (i=0; i<c; i++) {

        NSString *k=[keys objectAtIndex:i];

        NSString *v=[param objectForKey:k];

        

        NSString *paramStr = [NSString stringWithFormat:@"&%@=%@",k,[URICode escapeURIComponent:v]];

        [urlParams appendString:paramStr];

    }

    

    [urlParams replaceCharactersInRange:NSMakeRange(0,1) withString:@""];

    

    return (NSString*)urlParams;

}

抱歉!评论已关闭.