iOS 【network-OAuth授权步骤 阶段性获取 Access Token】

第三方访问服务提供商用户资源的时候,需要先进行OAuth授权。(举个例子,我制作了一个类似于微博的应用,那么我们就要去新浪微博或者是腾讯微博等等服务提供商获取OAuth授权,这样我们就可以使用用户发送的微博信息了)

OAuth授权的步骤大致分为三步:

① 获取未授权的 Request Token

② 获取用户授权的 Request Token

③ 用授权成功的 Request Token 换取 Access Token

每一步的大致做法我在这里说一下:

① 获取未授权的 Request Token

iOS 【network-OAuth授权步骤 阶段性获取 Access Token】_第1张图片

获取所需的三个参数在新浪开发者文档(http://open.weibo.com/wiki/Oauth2/authorize)中都能找到。要注意的是回调地址默认是@"http://",就是什么也不填。另外需要注意的是请求参数必选的才需要设置,我们需要将URL和必选参数拼接后发送请求给服务器。

iOS 【network-OAuth授权步骤 阶段性获取 Access Token】_第2张图片


② 获取用户授权的 Request Token

注意:如果用户不是第一次登陆第三方,那么就不会出现这个授权界面,会直接返回授权过的 Request Token

iOS 【network-OAuth授权步骤 阶段性获取 Access Token】_第3张图片



③ 用授权成功的 Request Token 换取 Access Token

只要我们获得了上面的code值,也就是成功被用户授权的Request Token,那么我们就可以用这个东西去换取一个access Token了。

iOS 【network-OAuth授权步骤 阶段性获取 Access Token】_第4张图片

这里的URL和请求参数也可以在新浪开发者文档(http://open.weibo.com/wiki/Oauth2/access_token)中找到。这里要注意一下了,参数全部都是必选的了。

iOS 【network-OAuth授权步骤 阶段性获取 Access Token】_第5张图片

最后只要是获取到 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;
}

access_token : 一个用户给一个应用授权成功后会获得对应的一个 access_token (这一串字符串包含两个信息: 应用信息用户信息

uid : 一个用户对应一个,是用户的唯一标识。(之后修改用户头像啦什么的要用到)

这两个参数是最重要的,举例,如果4个不同的用户分别给5个应用授权那么会得到20个 access_token,但是只会得到4个uid。

而 157679999 是 access_token 授权过期的时间,如果是开发者自己的账号,自己给自己授权,那么就是这个时间,单位是秒,大概是5年。

如果是搞一个测试账号来授权,只有一天的时间。

你可能感兴趣的:(Access,token,OAuth,第三方访问服务提供商用户资源)