`

新浪微博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;
}

分享到:
评论

相关推荐

    沈大海新浪微博iphone源代码oauth登录(网络修改版)

    《沈大海新浪微博iPhone源代码OAuth登录详解》 在移动应用开发中,特别是在社交网络平台的集成上,OAuth(授权)是一种广泛使用的安全机制,用于允许第三方应用在用户许可的情况下访问其资源,而无需获取用户的账号...

    新浪微博 iPhone 源码

    【标题】:“新浪微博 iPhone 源码” 【描述】中提到的“新浪微博实现的ios的源码”是指新浪微博为iOS平台开发的SDK(Software Development Kit),这是一个专为开发者设计的工具包,包含了实现微博功能所需的类库...

    iphone 新浪微博 示例程序

    《iPhone上的新浪微博示例程序详解》 在移动应用开发领域,iPhone平台因其用户基数庞大、交互体验优秀,一直是开发者关注的焦点。其中,社交媒体应用程序,尤其是像新浪微博这样的平台,为开发者提供了丰富的接口和...

    ios-新浪微博首页.zip

    在iOS平台上开发应用程序时,模仿新浪微博首页是一项挑战性的工作,涉及到多个关键技术点。"ios-新浪微博首页.zip"这个项目显然尝试实现这样的功能,但描述中提到的“数据查询还有点小问题”暗示开发者可能在数据...

    新浪微博客户端接入案例

    2. **OAuth 2.0授权**:为了接入新浪微博,你需要理解OAuth 2.0授权协议,这是大多数社交媒体平台用于安全地授权第三方应用访问用户数据的标准方法。在iOS应用中,你需要处理用户登录、获取授权码、刷新令牌等过程。...

    iOS新浪微博客户端

    在iOS平台上开发新浪微博客户端是一项常见的任务,尤其对于初学者来说,这是一个很好的实践项目,能够帮助他们深入理解iOS应用开发的基本流程和技术。在这个项目中,主要涉及的知识点包括: 1. **Swift编程语言**:...

    新浪微博请求(iPhone源代码)

     使用oauth2.0协议,封装了新浪微博的常用请求,登录,获取个人信息,获取微博,获取粉丝,关注,微博分类以及地理位置等请求。使用方便。请求使用的是MKNetworkkit第三方库。代码使用block来写的。

    Sina weibo

    总结,通过引入新浪微博SDK,进行OAuth认证,构建分享内容,调用分享接口,并处理结果反馈,我们可以在iPhone应用中实现新浪微博的分享功能。"testPost_SinaWeibo"文件为我们提供了一个具体的实例,帮助开发者理解和...

    微博IOS平台SDK文档V2.4.01

    SSO(Single Sign-On)授权是微博SDK的核心功能之一,它允许第三方iOS应用通过新浪微博的官方客户端快速进行OAuth2.0授权。这一过程极大地简化了用户登录的步骤,无需输入用户名和密码,只需一键授权即可。若用户未...

    poco美女秀 v1.0.1

    POCO美女秀是由国内最大原创图片分享社区POCO.CN推出的,专为爱使用手机拍照的美女们,记录美丽、参加活动、赢取礼品的一个手机展示和...1、新浪微博OAuth2.0支持; 2、修正了部分已知问题; 3、(iPhone)iOS6支持。

    ShareKit(iPhone源代码)

     利用OAuth协议认证登录各种微博,目前支持新浪微博,腾讯微博,豆瓣说,Twitter,网易微博。支持发送文字微博和带图片的微博。测试的时候,首先登录某个微博,然后点击“发送微博”或者“发送带图片的微博”按钮,...

    ios源码之分享到新浪demo.rar

    【标题解析】:“ios源码之分享到新浪demo.rar”这个标题表明这是一份iOS开发相关的源代码示例,特别关注的是如何将内容分享到新浪微博的实现。在iOS应用开发中,集成社交平台的分享功能是一项常见的需求,此处的...

    IOS新浪腾讯人人分享demo

    1. **新浪微博SDK**:新浪为开发者提供了iOS SDK,包含了登录、授权、发布微博等核心功能。通过SDK,开发者可以在应用内调用新浪的API,实现用户无需离开应用即可进行登录和分享。SDK中通常包括了所需的头文件、库...

    android开发资料大全

    一个完整的新浪微博客户端android版OAuth认证示例 超爽的android抽屉效果 65个Android实例教程汇总 基本控件及基本动画效果dem 2011android面试题目及其答案大全.rar Android面试题集锦 (陆续更新)(最新2012-6-18...

Global site tag (gtag.js) - Google Analytics