第三方想访问服务提供商的用户资源的时候,需要先进行OAuth授权。(举个例子,我制作了一个类似于微博的应用,那么我们就要去新浪微博或者是腾讯微博等等服务提供商获取OAuth授权,这样我们就可以使用用户发送的微博信息了)
OAuth授权的步骤大致分为三步:
① 获取未授权的 Request Token
② 获取用户授权的 Request Token
③ 用授权成功的 Request Token 换取 Access Token
每一步的大致做法我在这里说一下:
① 获取未授权的 Request Token
获取所需的三个参数在新浪开发者文档(http://open.weibo.com/wiki/Oauth2/authorize)中都能找到。要注意的是回调地址默认是@"http://",就是什么也不填。另外需要注意的是请求参数必选的才需要设置,我们需要将URL和必选参数拼接后发送请求给服务器。
② 获取用户授权的 Request Token
注意:如果用户不是第一次登陆第三方,那么就不会出现这个授权界面,会直接返回授权过的 Request Token
③ 用授权成功的 Request Token 换取 Access Token
只要我们获得了上面的code值,也就是成功被用户授权的Request Token,那么我们就可以用这个东西去换取一个access Token了。
这里的URL和请求参数也可以在新浪开发者文档(http://open.weibo.com/wiki/Oauth2/access_token)中找到。这里要注意一下了,参数全部都是必选的了。
最后只要是获取到 Access Token 就可以算是获取成功了。
简单列一下代码供大家参考:
#import "WZYOAuthViewController.h" #import "AFNetworking.h" @interface WZYOAuthViewController () <UIWebViewDelegate> @end @implementation WZYOAuthViewController - (void)viewDidLoad { [super viewDidLoad]; // 1、创建一个webView UIWebView *webView = [[UIWebView alloc] init]; webView.frame = self.view.bounds; webView.delegate = self; [self.view addSubview:webView]; // 2、用webView加载登陆界面(新浪提供的,是一个网页) // 请求地址:https://api.weibo.com/oauth2/authorize // client_id true string 申请应用时分配的AppKey。 // redirect_uri true string 授权回调地址,站外应用需与设置的回调地址一致,站内应用需填写canvas page的地址。 // 要将请求地址和请求参数用 ? 和 & 拼接一下并存放在字符串中 NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/oauth2/authorize?client_id=11111111&redirect_uri=http://"]; // 封装请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 使用webView加载该请求 [webView loadRequest:request]; } // webView每次加载都会调用这个方法 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 1、获得URL NSString *url = request.URL.absoluteString; // 2、判断是否为回调地址 // 在字符串中搜索是否有 @"code=" 这一段字符串,有就取出 NSRange range = [url rangeOfString:@"code="]; if (range.length != 0) { // 是回调地址没错了 // 截取 @"code=" 后面的参数值 // 找到 @"code=" 后面的第一个字符的位置 int fromIndex = range.location + range.length; // substringFromIndex 从该指定位置截取到最后(包含当前截取位置的字符) NSString *code = [url substringFromIndex:fromIndex]; // (code 就是我们授权成功后的 request token) // 用我们获取到的code值来换取一个accessToken [self accessTokenWithCode:code]; } return YES; } // 用我们获取到的code值来换取一个accessToken(code 就是我们授权成功后的 request token) - (void)accessTokenWithCode:(NSString *)code { // 1、请求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; mgr.responseSerializer = [AFJSONResponseSerializer serializer]; // 2、拼接请求参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; // AppKey 和 AppSecret 在开发者应用信息中都能够找到;第三个请求类型是固定格式;第四个就是我们上一步获取的授权成功后的request token值;第五个参数是回调地址,在开发者应用信息中也可以设置(保持一致即可,默认为@"http://") params[@"client_id"] = @"11111111"; params[@"client_secret"] = @"111111111111"; params[@"grant_type"] = @"authorization_code"; params[@"code"] = code; params[@"redirect_uri"] = @"http://"; // 3、发送请求 [mgr POST:@"https://api.weibo.com/oauth2/access_token" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { WZYLog(@"请求成功-%@",responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { WZYLog(@"请求失败-%@",error); }]; } #pragma mark - webView 的代理方法 (在这里可以看webView的执行次数) - (void)webViewDidStartLoad:(UIWebView *)webView { // WZYLog(@"webViewDidStartLoad---"); } - (void)webViewDidFinishLoad:(UIWebView *)webView { // WZYLog(@"webViewDidFinishLoad---"); } @end
2016-02-19 18:24:44.828 WZYMicroBlog[14354:2072974] 请求成功-{ "access_token" = "111111111111"; "expires_in" = 157679999; "remind_in" = 157679999; uid = 11111111; }
uid : 一个用户对应一个,是用户的唯一标识。(之后修改用户头像啦什么的要用到)
这两个参数是最重要的,举例,如果4个不同的用户分别给5个应用授权那么会得到20个 access_token,但是只会得到4个uid。
而 157679999 是 access_token 授权过期的时间,如果是开发者自己的账号,自己给自己授权,那么就是这个时间,单位是秒,大概是5年。
如果是搞一个测试账号来授权,只有一天的时间。