`

关于Sina WeiBo API OAuth 验证(ios)

阅读更多

#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonCryptor.h>
#import "Base64.h"

#define SINA_T_HOST

@"api.t.sina.com.cn"//api.t.sina.com.cn
#define SINA_WEIBO_APP_KEY @"YOUR APP KEY"
#define SECRET @"YOUR APP SECRET"
#define OAUTH_VERSION @"1.0"
#define OAUTH_SIGNATURE_METHOD @"HMAC-SHA1"

#pragma mark 获得时间戳
- (NSString *)_generateTimestamp
{
return [NSString stringWithFormat:@"%d", time(NULL)];
}

#pragma mark 获得随时字符串 // 这个可以获取随机数,不一定要用uuid的
- (NSString *)_generateNonce
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
NSMakeCollectable(theUUID);
return (NSString *)string;
}
#pragma mark 获取request_token的参数
-(void) getRequestToken {
NSString *baseUrl = [NSString stringWithFormat:@"http://%@/oauth/request_token", SINA_T_HOST];
NSString *nonce = [self _generateNonce];
NSString *timestamp = [self _generateTimestamp];

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

[self hmac_sha1_signature:@"GET" url:baseUrl param:info token_secret:@""]; // 获取签名
////////////////////
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"]];
////////////////////
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];
[theRequest setHTTPMethod:@"GET"];
[theRequest setValue:oauthHeader forHTTPHeaderField:@"Authorization"];
self.connect = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; // 开始连接 返回值在
}

// 获取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;
}


///////////////
#pragma mark webView几个delegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *pin = [self locateAuthPinInWebView:webView]; // 获取pin码
if ([pin length]> 0) {
[self getAccessToken];
}
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
}

#pragma mark 获取oauth_verifier授权码
- (NSString *) locateAuthPinInWebView:(UIWebView *)webView {
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerText"];
if ([html hasPrefix:@"获取到的授权码:"]) {
NSRange verifierRange=[html rangeOfString:@"获取到的授权码:"];
NSRange verifierRanges=NSMakeRange(verifierRange.location+verifierRange.length, 6);
NSString *verifer=[html substringWithRange:verifierRanges];
NSLog(@"%@",verifer);
self.oauth_verifier=verifer;
}
if (self.oauth_verifier.length > 0) return self.oauth_verifier;
if (html.length == 0) return nil;

const char *rawHTML = (const char *) [html UTF8String];
int length = strlen(rawHTML), chunkLength = 0;

for (int i = 0; i < length; i++) {
if (rawHTML[i] < '0' || rawHTML[i] > '9') {
if (chunkLength == 6) {
char *buffer = (char *) malloc(chunkLength + 1);

memmove(buffer, &rawHTML[i - chunkLength], chunkLength);
buffer[chunkLength] = 0;

self.oauth_verifier = [NSString stringWithUTF8String: buffer];
free(buffer);
return self.oauth_verifier;
}
chunkLength = 0;
} else
chunkLength++;
}
return nil;
}
#pragma mark 获取Access Token
- (void) getAccessToken {
NSString *baseUrl = [NSString stringWithFormat:@"http://%@/oauth/access_token", SINA_T_HOST];
NSString *nonce = [self _generateNonce];
NSString *timestamp = [self _generateTimestamp];

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.oauth_verifier,@"oauth_verifier",
OAUTH_VERSION,@"oauth_version",nil];
[self hmac_sha1_signature:@"GET" url:baseUrl param:info token_secret:self.oauth_token_secret];

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"]];

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];
[theRequest setHTTPMethod:@"GET"];
[theRequest setValue:oauthHeader forHTTPHeaderField:@"Authorization"];
self.connect = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
}
----------------------NSURLConnectionDelegate-------------------
#pragma mark
#pragma mark NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)aResponse
{
NSHTTPURLResponse *resp = (NSHTTPURLResponse*)aResponse;
if (resp) {
NSLog(@"Response: %d", resp.statusCode); // 返回编号
}
}
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data
{
NSString *stringData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"String Data %@",stringData); // 返回信息
// 这个stringdata要截取oauth_token,oauth_token_secret
//
}
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

NSString* msg = [NSString stringWithFormat:@"Error: %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSErrorFailingURLStringKey]];
NSLog(@"Connection failed: %@", msg); // 错误信息

}

-----------------------------------------生成签名--------------------------------
// 生成签名
-(void) hmac_sha1_signature:(NSString*) method url:(NSString*) baseUrl param:(NSDictionary*) param token_secret:(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:[self ab_RFC3986EncodedString:v]];// URI 编码
}

NSString *urlEncodeBaseUrl = [self ab_RFC3986EncodedString:baseUrl]; // URI 编码
NSString *urlParam = (NSString*)mutUrlParam;
urlParam = [self ab_RFC3986EncodedString:urlParam]; // URI 编码
NSString *sbs = [NSString stringWithFormat:@"%@&%@&%@", method, urlEncodeBaseUrl, urlParam];
NSString *key = [NSString stringWithFormat:@"%@&%@",SECRET, token_secret];
NSString *oauth_signature = [self hmac_sha1:key text:sbs];

[param setValue:oauth_signature forKey:@"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,[self ab_RFC3986EncodedString:v]];
[urlParams appendString:paramStr];
}

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


- (NSString *)hmac_sha1:(NSString *)key text:(NSString *)text{

const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];

char cHMAC[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
NSString *hash = [Base64 encode:HMAC];//base64 编码。
[HMAC release];
return hash;
}

- (NSString *)ab_RFC3986EncodedString:(NSString *)v // UTF-8 encodes prior to URL encoding
{
NSMutableString *result = [NSMutableString string];
const char *p = [v UTF8String];
unsigned char c;

for(; c = *p; p++)
{
switch(c)
{
case '0' ... '9':
case 'A' ... 'Z':
case 'a' ... 'z':
case '.':
case '-':
case '~':
case '_':
[result appendFormat:@"%c", c];
break;
default:
[result appendFormat:@"%%X", c];
}
}
return result;
}



--------------------------我的问题------------------------------
#pragma mark SendWeiBo

// 这个东西呢,我一直返回的信息是错误的。有时是少个appkey。有时候是验证失败。
// 如果有高人的话,麻烦帮我解答下。
-(IBAction) send {
NSString *message = [m_textField text]; // 获取发送的文本内容
if ([message length] > 0) {
self.oauthType = 3;
NSString *baseUrl = [NSString stringWithFormat:@"http://%@/statuses/update.xml", SINA_T_HOST];
NSString *nonce = [self _generateNonce];
NSString *timestamp = [self _generateTimestamp];
NSString *status = message;
NSMutableDictionary* info = [NSMutableDictionary dictionaryWithObjectsAndKeys:
SINA_WEIBO_APP_KEY,@"oauth_consumer_key",
nonce,@"oauth_nonce",
OAUTH_SIGNATURE_METHOD,@"oauth_signature_method",
timestamp,@"oauth_timestamp",
self.oauth_token,@"oauth_token",
self.oauth_verifier,@"oauth_verifier",
OAUTH_VERSION,@"oauth_version",
SINA_WEIBO_APP_KEY,@"source",
status,@"status",
nil];

[self hmac_sha1_signature:@"POST" url:baseUrl param:info token_secret:self.oauth_token_secret];

NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm="%@", oauth_consumer_key="%@", oauth_token="%@", oauth_signature_method="%@", oauth_signature="%@", oauth_timestamp="%@", oauth_nonce="%@", oauth_version="1.0", source="%@" ",
@"",
[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_nonce"],
[info valueForKey:@"source"],
[info valueForKey:@"status"]
];//,status="%@"

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPShouldHandleCookies:NO];
[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
int contentLength = [oauthHeader lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
[theRequest setValue:[NSString stringWithFormat:@"%d", contentLength] forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPBody:[oauthHeader dataUsingEncoding:NSUTF8StringEncoding]];
self.connect = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
}
}
分享到:
评论

相关推荐

    IOS sina 腾讯 微博 Oauth2.0 授权DEMO

    这个“IOS sina 腾讯 微博 OAuth2.0 授权DEMO”是一个演示如何在iOS应用中实现Sina Weibo和Tencent Weibo的OAuth2.0授权流程的实例。 首先,OAuth2.0的核心概念是授权码(Authorization Code)。当用户同意应用访问...

    ios5新浪微博使用Oauth

    在iOS中,我们通常通过URL Scheme来启动Sina Weibo的应用,引导用户进行授权,然后回调我们的应用,获取授权后的访问令牌。 1. **注册应用** 在使用新浪开放平台之前,开发者需要在新浪开发者网站上注册一个新的...

    新浪微博 Sina Weibo SDK

    《全面解析:新浪微博Sina Weibo SDK》 在数字化时代,社交媒体成为了信息传播与互动的重要平台,其中,新浪微博以其庞大的用户基数和丰富的功能,成为众多企业和个人开发者关注的焦点。为了方便开发者集成微博功能...

    ios5新浪微博Oauth的使用

    本文将深入探讨如何在iOS 5.0及以上版本中使用新浪开放平台的OAuth进行授权登录和数据交互。OAuth是一种授权框架,允许第三方应用安全地访问用户在特定服务上的数据,而无需获取用户的账号密码。 首先,你需要在...

    (0144)-iOS/iPhone/iPAD/iPod源代码-其他(Others)-Sina Weibo Oauth

    实现微博登录(利用OAuth协议登录)、读取数据、撰写微博等功能。 注意:请在Mac下解压使用

    ios版新浪微博客户端源代码

    ios版本新浪微博客户端源代码 client_ID = (你申请应用的appkey) client_SERCRET =(你申请应用的app_secret) redirect_URI =(回调地址,跟网上配置的一致,本人比较穷,而且用的是客户端,所以这里就为空) ...

    ios新浪微博demo

    总之,"ios新浪微博demo"是一个实践性极强的学习资源,涵盖了iOS开发中与微博集成的多个方面,包括SDK集成、OAuth2.0授权、用户登录、内容分享、获取用户信息等功能。通过这个Demo,开发者可以深入理解如何在自己的...

    ios 新浪微博分享

    在iOS应用开发中,集成新浪微博分享功能是一项常见的需求,它可以让用户方便地将内容发布到自己的新浪微博账号上,增加应用的互动性和用户粘性。本文将深入探讨如何在iOS项目中实现新浪微博分享,主要涉及以下几个...

    iOS sina和QQ的授权与分享

    对于Sina Weibo(新浪微博)的授权,我们可以使用Sina Weibo的SDK,它提供了OAuth2.0协议来实现安全的授权流程。首先,在项目中导入SDK,并注册你的应用以获取AppKey、AppSecret和RedirectURI。然后,调用SDK的`...

    iOS登录新浪微博

    在iOS平台上实现微博登录功能,特别是接入新浪微博,是许多移动应用开发者经常遇到的任务。这篇教程将深入探讨如何在iOS应用中集成新浪微博SDK,实现在Xcode 5.0.2环境下进行用户授权登录并获取相关数据的过程。我们...

    腾讯&新浪&网易第三方登陆API

    在互联网应用开发中,第三方登录接口(Third-Party Login API)是常见的用户身份验证机制,允许用户使用已有的社交账号(如腾讯QQ、新浪Weibo、网易163邮箱)来登录新应用,无需创建新的账号和密码。这种方式提高了...

    Sina Weibo OAuth(iPhone源代码)

    来源:未知Licence:未知平台:iOS设备:iPhone / iPad作者:liuyuning ... 实现微博登录(利用OAuth协议登录)、读取数据、撰写微博等功能。 Code4App编译测试,适用环境:Xcode 4.3, iOS 5.0。

    ios新浪微博分享demo+文档

    在iOS平台上实现新浪微博分享功能,开发者需要借助新浪提供的SDK(Software Development Kit)来完成。"ios新浪微博分享demo+文档"是一份包含示例代码和官方文档的资源,它旨在帮助开发者快速理解和集成微博分享功能...

    weibo_ios_sdk_sso-oauth:sso和Oauth2.0的新浪微博sdk

    微博 IOS 平台 SDK 为第三方应用提供了简单易用的微博API调用服务,使第三方客户端无需了解复杂的验证机制即可进行授权登陆,并提供微博分享功能,可直接通过微博官方客户端分享微博。 名词解释 名词 注解 AppKey ...

    新浪微博ios

    1. Social Framework:苹果提供的Social Framework可以帮助开发者轻松集成Sina Weibo的SDK,实现登录、分享等功能。 八、性能优化 1. 异步加载:为了提高用户体验,内容如图片、评论等应异步加载,避免阻塞主线程。...

    Sina weibo

    新浪微博的API调用通常需要OAuth 2.0授权,因此我们需要注册应用,获取App Key、App Secret和Redirect URI。在用户授权后,通过App Secret和用户授权码换取Access Token,这将用于后续的API请求。 三、分享内容的...

    微博iOS平台 SDK以及实例

    1. 下载SDK:首先,你需要从新浪官方或者GitHub上下载最新的weibo_ios_sdk-master压缩包。 2. 引入库:将解压后的SDK文件夹导入到Xcode项目中,配置相应的库和框架,如Security、SystemConfiguration、CoreGraphics...

    微博app源码 ios

    源码中会实现这些功能的业务逻辑,可能涉及到OAuth认证、社交API调用等。 7. **性能优化**:为保证流畅体验,源码会包含性能优化措施,如异步加载、内存管理、图片缓存等。 8. **测试与调试**:源码中还会包含单元...

    monotouch版新浪微博sdk

    MonoTouch版新浪微博SDK是专为使用Xamarin.MonoTouch开发iOS应用的开发者设计的一个工具包。这个SDK使得在iOS平台上集成新浪微博服务变得简单,允许开发者能够实现用户登录、分享内容、获取用户信息等功能,从而增强...

Global site tag (gtag.js) - Google Analytics