第一部分为通过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=%@&redirect_uri=%@&display=moblie&response_type=code&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请求成功。