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:
#import <Foundation/Foundation.h>
#import <AFNetworking.h>
@interface NetWorkCallBack : AFHTTPSessionManager @end
NetWorkCallBack.m:
#import "NetWorkCallBack.h"
#import <SSKeychain.h>
@implementation NetWorkCallBack - (NSURLSessionDataTask *)dataTaskWithRequest:(NSMutableURLRequest *)urlRequest completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))originalCompletionHandler{ //create a completion block that wraps the original
void (^authFailBlock)(NSURLResponse *response, id responseObject, NSError *error) = ^(NSURLResponse *response, id responseObject, NSError *error)
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
if([httpResponse statusCode] == ){ //如果access token过期,返回错误,调用此block
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, ), ^{ //调用refreshAccesstoken方法,刷新access token。
[self refreshAccessToken:^(AFHTTPRequestOperation *operation) {
//存取新的access token,此处我使用了KeyChain存取
NSDictionary *headerInfo = operation.response.allHeaderFields;
NSString *newAccessToken = [headerInfo objectForKey:@"access-token"];
NSString *newRefreshToken = [headerInfo objectForKey:@"refresh-token"];
[SSKeychain deletePasswordForService:@"<key>" account:@"access-token"];
[SSKeychain deletePasswordForService:@"<key>" account:@"refresh-token"];
[SSKeychain setPassword:newAccessToken forService:@"<key>" account:@"access-token"];
[SSKeychain setPassword:newRefreshToken forService:@"<key>" account:@"refresh-token"]; //将新的access token加入到原来的请求体中,重新发送请求。
[urlRequest setValue:newAccessToken forHTTPHeaderField:@"access-token"]; NSURLSessionDataTask *originalTask = [super dataTaskWithRequest:urlRequest completionHandler:originalCompletionHandler];
[originalTask resume];
}];
});
}else{
NSLog(@"no auth error");
originalCompletionHandler(response, responseObject, error);
}
}; NSURLSessionDataTask *stask = [super dataTaskWithRequest:urlRequest completionHandler:authFailBlock]; return stask; }; /*
*获取新的token的方法。如何获取可以自定义,我这里用了AFNetWorking的AFHTTPRequestOperation类
*/
-(void)refreshAccessToken:(void(^)(AFHTTPRequestOperation *responseObject))refresh{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:@"<yourURL>"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; //将原来的access token和refresh token发送给服务器,以获取新的token
NSString *accessToken = [SSKeychain passwordForService:@"<key>" account:@"access-token"];
NSString *refreshToken = [SSKeychain passwordForService:@"<key>" account:@"refresh-token"]; [request setValue:accessToken forHTTPHeaderField:@"access-token"];
[request setValue:refreshToken forHTTPHeaderField:@"refresh-token"]; //执行网络方法
AFHTTPRequestOperation *httpRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * operation, id responseObject) {
refresh(operation);
} failure:^(AFHTTPRequestOperation * operation, NSError * error) {
refresh(operation);
}];
[httpRequestOperation start];
}
@end
iOS实现OAuth2.0中刷新access token并重新请求数据操作的更多相关文章
- 工作笔记—新浪微博Oauth2.0授权 获取Access Token (java)
java发送新浪微博,一下博客从注册到发布第一条微博很详细 利用java语言在eclipse下实现在新浪微博开发平台发微博:http://blog.csdn.net/michellehsiao/art ...
- 新浪微博Oauth2.0授权 获取Access Token
新浪微博开放平台提供了丰富的API接口,利用这些接口,开发者能够开发出独具特色的微博应用.但是,大部分接口都需要用户授权给应用,应用利用授权得到的Access Token来调用相应的接口来获取内容. ...
- ASP.NET OAuth:解决refresh token无法刷新access token的问题
最近同事用iOS App调用Open API时遇到一个问题:在access token过期后,用refresh token刷新access token时,服务器响应"invalid_gran ...
- OAuth 白话简明教程 4.刷新 Access Token
转自:http://www.cftea.com/c/2016/11/6705.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...
- 在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据
在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持 Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Jso ...
- Python实现接口测试中的常见四种Post请求数据
前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...
- iOS新浪微博OAuth2.0认证代码
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...
- Thinkphp中controller控制器根据curl函数请求数据
public function member(){ $url="http://aitequn.tjnit.com/UserAction_findAllUser"; $ch =cur ...
- OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token
在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等 ...
随机推荐
- ppt画笔标记在哪里|ppt中画笔工具功能怎么用?
一.ppt中画笔工具功能在哪里? 这个画笔工具其实就相当于我们的一个标记工具,要实现标记功能首先将需要演示的PPT按住F5进入到放映状态,然后在右击ppt上的空白处就会弹出衣蛾对话框,在对话框中选择“ ...
- UVa 673 Parentheses Balance(栈的使用)
栈 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description You are ...
- 转:PHP乱码问题,UTF-8(乱码)
原文来自于:http://www.cnblogs.com/rickyNote/archive/2012/04/09/2438704.html 一.HTML页面转UTF-8编码问题 1.在head后,t ...
- DEDECMS调用最新评论
{dede:feedback row='5' titlelen='24' infolen='80'} <div class="yhplk"><div>[fi ...
- Macro Substitution
看<C程序设计语言>(英文版)学到的两个用法. 两个很简单的宏用法. #的用法: if, however, a parameter name is preceded by a # in t ...
- Generate Parentheses——LeetCode
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 尚学堂 JAVA DAY11 概念总结
1.冒泡排序算法 <升序排列> 思路1: 数组长度为n,那么要对数组进行n-1次遍历; step 1---从数组的第一个数开始,两两比较,如果第一个数 > 第二个数,将二者进行交换: ...
- git init
git clone git@code.easyunion.net:516059158/cloud-basic-knowledge.git添加codes;git add .;git commit -m ...
- GMU
NEXT | 不错过任何一个新产品 百度开源 Mobile UI 组件库,提供 Web app.Pad 端简单易用的 UI 组件 发表评论
- L - Kakuro Extension - HDU 3338 - (最大流)
题意:有一个填数字的游戏,需要你为白色的块内填一些值,不过不能随意填的,是有一些规则的(废话),在空白的上方和作方给出一些值,如果左下角有值说明下面列的和等于这个值,右上角的值等于这行后面的数的和,如 ...