微博阅读器demo(一)OAuth 2.0 认证

        微博阅读器demo实现过程分为两个部分:

        第一部分为通过OAuth 2.0 认证

首先注册一个微博开放平台的开发者账号,创建一个应用,获得app key和app secret。前往管理中心-》应用信息-》高级信息,编辑OAuth2.0 授权设置,将其设置为一个网址。

查看微博OAuth2API,可知微博OAuth 2.0认证分为两步:1.请求授权;2.获取授权。

        请求授权:用Get方法调用接口“https://api.weibo.com/oauth2/authorize”,加上请求参数。调用uiwebview 的 loadRequest显示授权页面

- (void)viewDidLoad
{
    self.httpHelper =[[HttpHelper alloc]init];
    self.urlHelper = [[UrlHelper alloc]init];
    [super viewDidLoad];
    NSString * redirect_uri =[self.urlHelper  urlForKey:@"redirect_uri"];
    NSString * url = [NSString stringWithFormat:[self.urlHelper urlForKey:@"authorize"],APP_KEY,redirect_uri];
    NSURLRequest * request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
    [self.webView setDelegate:self];
    [self.webView loadRequest:request];
}
我将demo所用到的所有接口存放在一个plist文件中,并创建一个辅助类UrlHelper进行管理,上面的urlHelper即UrlHelper的一个实例,UrlHelper代码如下:

#import <Foundation/Foundation.h>


@interface UrlHelper : NSObject
@property (nonatomic) NSDictionary * urlDictionary;   //用于保存plist文件中的数据
-(NSString *) urlForKey:(NSString *)key;              //通过键值找到对应数据
-(NSString *) accessToken;
@end




#import "UrlHelper.h"


@implementation UrlHelper
-(id) init
{
    self = [super init];
	if(self != nil)
	{
		self.urlDictionary = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Url" ofType:@"plist"]];
	}
	return self;
}


-(NSString *) urlForKey:(NSString *)key
{
    NSString * url = nil;
    url = [self.urlDictionary objectForKey:key];
    return url;
}


-(NSString *) accessToken
{
    NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];
    NSString * token = [userDefault objectForKey:@"access_token"];
    return token;
}
@end

plist中的数据类似如下:https://api.weibo.com/oauth2/authorize?client_id=%@&amp;redirect_uri=%@&amp;display=moblie&amp;response_type=code&amp;state=authorize

只需传入client_id(即app key)和回调地址,即可得到完整授权地址。请求成功,UIWebview会重定向到回调地址所指定的网址,重定向的url中就包含了我们需要的code,我们只需实现 UIWebViewDelegate 的委托方法   -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType      判断当前url是否以我们指定的回调地址,如果是就截取出code,并进行下一步的“获取授权”

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString * str =[[request URL] absoluteString];       //   获取完整路径
    if([str hasPrefix:[self.urlHelper urlForKey:@"redirect_uri"]])      //是否以回调地址开头
    {
        NSArray * array = [str componentsSeparatedByString:@"code="];      //  获取code
        NSString * code = [array lastObject];
        if(code)      
        {
            NSString * paramterString  =[NSString stringWithFormat:[self.urlHelper urlForKey:@"access_token_paramter"],APP_KEY,APP_SECRECT,[self.urlHelper urlForKey:@"redirect_uri"],code];   //  获取post方法的请求body
   
            NSData * receive = [self.httpHelper SynchronousPostWithUrl:[self.urlHelper urlForKey:@"access_token"] andParameter:paramterString];   //  这里用post方法(只能用post方法)进行获取授权,其中httpHelper为自定义的类

            NSDictionary * dic =[NSJSONSerialization JSONObjectWithData:receive options:NSJSONReadingMutableLeaves error:nil];     //利用NSJSONSerialization 将json文件解析成字典
            NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];       //  数据持久化
            [userDefault setObject:[dic objectForKey:@"access_token"] forKey:@"access_token"];     //   保存access_token
            [userDefault setObject:[dic objectForKey:@"expires_in"] forKey:@"expires_in"];
            [userDefault setObject:[dic objectForKey:@"uid"] forKey:@"uid"];         
            [userDefault synchronize];
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];    //  获取access_token成功,跳转到主界面
            [self presentModalViewController:[storyboard instantiateInitialViewController] animated:YES ];
        }
    }
    return YES;
}

另外有一点要注意的是,如果应用未经过审核,进行授权的微博账户必须是开发者账号的微博账户或测试账户(在应用管理中添加)。

至此,我们就拿到了access_token,并将其存在文件中,OAuth2.0请求成功。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值