Network 【OAuth授权步骤 阶段性获取 Access Token】

来源:互联网 发布:山东七维新材料 知乎 编辑:程序博客网 时间:2024/05/16 18:02

第三方访问服务提供商用户资源的时候,需要先进行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;}

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

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

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

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

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

1 0
原创粉丝点击