iOS实现OAuth2.0中刷新access token并重新请求数据操作

一、简要概述

  OAuth2.0是OAuth协议的下一版本,时常用于移动客户端的开发,是一种比较安全的机制。在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的refresh token。这将允许客户端无需用户再次操作而获取一个新的access token,并且也限制了access token的有效期。即当sever发送的access token过期之后,客户端会调用方法,将access token和refresh token发送给服务端,服务端将会返回新的access token和refresh token。

二、应用场景

  用户登录后,服务端会发行一个有效时间的access token,同时也会发行一个长生命期的refresh token。用户在进行其他网络请求时,会把access token加入请求体中(并不需要加入refresh token)。如果在请求过程中,access token过期,返回相应的状态码。这时就回调用一个回调方法,在回调方法体中将原来的access token和refresh token发送给服务端,获取新的access token和refresh token。然后把新的access token加入刚才的请求体中,重新加载网络请求。

  限定access token的有效时间,只是为了提高安全性。access token过期后重新获取并重新加载请求这一操作,用户是察觉不到的。这种机制在微信、QQ、微博等客户端中尤为常见。

三、实例代码

  (1)此类继承了AFNetworking中的AFHTTPSessionManager类,并重写了里面的方法。

  NetWorkCallBack.h:

  

1 #import <Foundation/Foundation.h>
2 #import <AFNetworking.h>
3 @interface NetWorkCallBack : AFHTTPSessionManager
4
5 @end

  NetWorkCallBack.m:

  

 1 #import "NetWorkCallBack.h"
 2 #import <SSKeychain.h>
 3 @implementation NetWorkCallBack
 4
 5 - (NSURLSessionDataTask *)dataTaskWithRequest:(NSMutableURLRequest *)urlRequest completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))originalCompletionHandler{
 6
 7     //create a completion block that wraps the original
 8     void (^authFailBlock)(NSURLResponse *response, id responseObject, NSError *error) = ^(NSURLResponse *response, id responseObject, NSError *error)
 9     {
10         NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
11         if([httpResponse statusCode] == 401){
12
13             //如果access token过期,返回错误,调用此block
14             dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
15
16                 //调用refreshAccesstoken方法,刷新access token。
17                 [self refreshAccessToken:^(AFHTTPRequestOperation *operation) {
18                     //存取新的access token,此处我使用了KeyChain存取
19                     NSDictionary *headerInfo = operation.response.allHeaderFields;
20                     NSString *newAccessToken = [headerInfo objectForKey:@"access-token"];
21                     NSString *newRefreshToken = [headerInfo objectForKey:@"refresh-token"];
22                     [SSKeychain deletePasswordForService:@"<key>" account:@"access-token"];
23                     [SSKeychain deletePasswordForService:@"<key>" account:@"refresh-token"];
24                     [SSKeychain setPassword:newAccessToken forService:@"<key>" account:@"access-token"];
25                     [SSKeychain setPassword:newRefreshToken forService:@"<key>" account:@"refresh-token"];
26
27                     //将新的access token加入到原来的请求体中,重新发送请求。
28                     [urlRequest setValue:newAccessToken forHTTPHeaderField:@"access-token"];
29
30                     NSURLSessionDataTask *originalTask = [super dataTaskWithRequest:urlRequest completionHandler:originalCompletionHandler];
31                     [originalTask resume];
32                 }];
33             });
34         }else{
35             NSLog(@"no auth error");
36             originalCompletionHandler(response, responseObject, error);
37         }
38     };
39
40     NSURLSessionDataTask *stask = [super dataTaskWithRequest:urlRequest completionHandler:authFailBlock];
41
42     return stask;
43
44 };
45
46
47 /*
48  *获取新的token的方法。如何获取可以自定义,我这里用了AFNetWorking的AFHTTPRequestOperation类
49  */
50 -(void)refreshAccessToken:(void(^)(AFHTTPRequestOperation *responseObject))refresh{
51     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:@"<yourURL>"];
52
53     [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
54
55     //将原来的access token和refresh token发送给服务器,以获取新的token
56     NSString *accessToken = [SSKeychain passwordForService:@"<key>" account:@"access-token"];
57     NSString *refreshToken = [SSKeychain passwordForService:@"<key>" account:@"refresh-token"];
58
59     [request setValue:accessToken forHTTPHeaderField:@"access-token"];
60     [request setValue:refreshToken forHTTPHeaderField:@"refresh-token"];
61
62     //执行网络方法
63     AFHTTPRequestOperation *httpRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
64     [httpRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * operation, id responseObject) {
65         refresh(operation);
66     } failure:^(AFHTTPRequestOperation * operation, NSError * error) {
67         refresh(operation);
68     }];
69     [httpRequestOperation start];
70 }
71 @end
时间: 2024-10-16 01:53:45

iOS实现OAuth2.0中刷新access token并重新请求数据操作的相关文章

ASP.NET OAuth:解决refresh token无法刷新access token的问题

最近同事用iOS App调用Open API时遇到一个问题:在access token过期后,用refresh token刷新access token时,服务器响应"invalid_grant"错误:而在access token没有过期的情况下,能正常刷新access token. 先查看了一下OAuth规范中的“Refreshing an Expired Access Token”流程图,以确认客户端的操作流程有没有问题. 问题发生在上图中的(G)操作步骤.iOS App就是按上图的

在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据

在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持   Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 使用方法不一致,对于3.0以前版本升级有限制.如果前端代码以固定更没法用了. 在Asp.Net Core 3.0中如何使用  Newtonsoft.Json 库序列化数据 官方给出了兼容处理方案,操作步骤如下: 1.引用Microsoft.AspNetCore

iOS新浪微博OAuth2.0认证代码

#import "ViewController.h" #import "AFNetworking.h" @interface ViewController ()<UIWebViewDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1.使用webview UIWebView *webView = [[UIWebView all

OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等. 选择微博登陆后,爱奇艺会向用户申请授权用于微博登陆(当用户已经登陆了微博时会直接申请授权,当用户没有登陆时会提示用户登陆微博): 此时提示窗口的 url 为:https://api.weibo.com/oauth2/authorize?scope=&redirect_uri=http%3A%2F

***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权

本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言.本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息,而无需模拟登录. 在本文中,特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token,方倍工作室分别称为全局Access Token和授权Access

微信公众平台开发(71)OAuth2.0网页授权

微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一.什么是OAuth2.0 官方网站:http://oauth.net/   http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secure

NET仿微信Oauth2.0

这个文章先说一说Oauth2.0的原理,再到应用场景,最后才是代码实现,这样才学会最终的思想,并在应用场景使用,所谓实践出真理. 1,Oauth2.0的原理 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.在互联网,经常用到OAuth2.0无非有三种场景: 1.1对外完全开放,系统与系统的对接,例如淘宝开放平台. 1.2内部系统对内部系统,如:(api.xxxx.com是一个子系统,web.xxxx.com是另外一个业务线的子系统

Oauth2.0详解及安全使用

引言:刚刚参加工作的时候接到的第一个任务就是接入新浪的联合登录功能,当时新浪用的还是oauth1.0协议.接入的时候没有对oauth协议有过多的了解,只是按照开放平台的接入流程进行开发,当时还在想这么麻烦就是为了作一个登录功能?(为当年的无知汗颜...).再后来上家公司需要开发一套自己的基于oauth2.0的联合登录功能,粗粗的看了下oauth2.0协议流程,自以为了解了便开始设计开发,现在来看真是漏洞无数啊(幸好现在功能已经下线).最近在现家公司要作部门内部分享,所以打算好好的研究一下oaut

(转)微信公众平台开发 OAuth2.0网页授权

微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一.什么是OAuth2.0 官方网站:http://oauth.net/   http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secure