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;
}
方法: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;
}