iOS7 新浪微博客户端开发 (OAuth2.0认证篇)

来源:互联网 发布:寻侠洗髓软件 编辑:程序博客网 时间:2024/06/07 03:02

本人最近开始了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,拿到我们想要的数据



思路非常清晰:我们要登录到

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

其中 ? 后面跟着的是服务端需要的参数,具体阅读文档.

给用户提供登录授权界面,很简单,只用创建一个webView,设置好相应参数之后访问这个网页就可以了.



再回头看文档的下一步:


2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE


3. 换取Access Token

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE

(其中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就是

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=

尾部再补上刚刚获取到的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跳转到我的应用的下一个界面,然后再进行其他的操作。


0 0
原创粉丝点击