本人最近开始了iOS的学习,学习开发了一个读取新浪微博的应用,本文主要记录了本人OAuth2.0认证的过程,如有错误,欢迎指出。
本人学习过程中借鉴了:
http://blog.csdn.net/crayondeng/article/details/8805381
http://blog.csdn.net/jkay_wong/article/details/7481129
两篇博客的内容,在此感谢两位大神。
在新浪微博开放平台(http://open.weibo.com/ )的管理中心中按步骤创建好自己的应用之后,邮箱会收到一封确认邮件:
这里面的AppKey与AppSecret是应用与新浪微博数据端交互的凭借。
根据文档,我们知道,整个认证的核心就是获取access_token,只有拿到了access_token才能调用新浪的API,拿到我们想要的数据
思路非常清晰:我们要登录到
其中 ? 后面跟着的是服务端需要的参数,具体阅读文档.
给用户提供登录授权界面,很简单,只用创建一个webView,设置好相应参数之后访问这个网页就可以了.
再回头看文档的下一步:
2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE
3. 换取Access Token
(其中client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET可以使用basic方式加入header中)
用户同意授权之后,web将自动跳转到你指定的回调页面,并含有参数code,这一步我们需要解析回调的URL,从中抽取出code的值供我们的程序使用
在函数- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 中,我们可以对回调页面进行判定:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
//接受URL
NSURL *backUrl = [request URL];
NSString *backUrlString = [backUrl absoluteString];
//如果是正确的回调页
if( [backUrlString hasPrefix:CBackUrlPrefix])
{
NSLog(@"The back URL is : %@",backUrlString);
//如果正确,返回值有 code(用于调用access_token,接口获取授权后的access token。)important!!!!!
NSRange codeRange = [backUrlString rangeOfString:@"code="];//返回code=第一次出现的位置,以及"code="的长度(5?)
//根据range和code=的位置确定code的值
NSRangerealRange = NSMakeRange(codeRange.length + codeRange.location, backUrlString.length-(codeRange.length + codeRange.location));//因为code是最后的参数,所以code的值的长度就是code= 到 最后。
NSString *codeValue = [backUrlString substringWithRange:realRange];
//用code拿 access token
NSLog(@"code=%@",codeValue);
NSMutableString *getAccessToken = [[NSMutableString alloc]initWithString:CAccessTokenURL];
[getAccessToken appendString:codeValue];
NSLog(@"accessToken URL is : %@",getAccessToken);
NSDictionary *dataDic= [[JsonToDictionary getInstance]accessJSON:getAccessToken withHTTPMethod:@"POST" andHTTPBody:@"type-focus-c"];
self.acToken = [dataDic objectForKey:@"access_token"];
NSLog(@"access_token is : %@",self.acToken);
self.life = [[dataDic objectForKey:@"expires_in"]longLongValue];
NSLog(@"life=%lli",self.life);
// NSLog(@"userfile name = %@",userInfoPath);
}
if(self.life > 0)
{
[self performSegueWithIdentifier:@"showBlogs" sender:self];
}
return YES;
}
shouldStartLoadWithRequest 是在webView已经获得了URL并创建了相应的URLRequest之后、运行该Request之前调用的,在用户同意授权之后,webView将自动获得一个前往redirect_url的请求,所以在每次webView更新的时候我们都进行判定:
//如果是正确的回调页
if( [backUrlString hasPrefix:CBackUrlPrefix])
其中CBackUrlPrefix就是你自己设定的回调页,如果说此时webView正访问你的回调页,说明授权成功,此时我们就要获取回调页url后部的code值,利用NSRange,我们就可以很轻松的获得到code。
拿到code之后,我们就可以去获取我们想要的access_token了。
同样,我们要通过访问URL来达到与服务端的交互:
NSMutableString *getAccessToken = [[NSMutableString alloc]initWithString:CAccessTokenURL];
[getAccessToken appendString:codeValue];
在这里,CAccessTokenURL就是
尾部再补上刚刚获取到的code值。
这次访问就可以得到access_token,不过不同的是,这次新浪并不是给一个回调地址,而是直接以JSON形式将access_token 以及它的生命周期放在网页*你获取,在这里我使用的是JsonKit 解析JSON数据,ios7的ARC是不支持JSONKIT的,所以会报一堆错误,解决方案:按照xcode的提示进行修改,然后在BuildPhasese中的JsonKit.m后面加上-fno-objc-arc 即可。网上也有其他的解决方案,可以自行查找。
做到这一步,应该就可以拿到access_token了,如果说以上步骤全部无误,那么请检查你的URLRequest的HttpMethod是否匹配(文档中查看),如果说HttpMethod都是对的,那么说明是网络问题(个人觉得是新浪的问题,因为本人同一段代码有时拿得到,有时又拿不到),只能等一段时间再测试。
拿到access_token之后,就可以调用新浪的API了,调用方式基本和获取access_token方式相同,指定的url后面跟着参数,再用Json读取网页中的内容即可。在这里我先segue跳转到我的应用的下一个界面,然后再进行其他的操作。