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

本人最近开始了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的值
            NSRange	realRange = 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跳转到我的应用的下一个界面,然后再进行其他的操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值