新浪微博OAUTH方法-iPhone

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值