如何使用 AFOAuth2Manager 自动刷新过期的令牌?
How to automatically refresh expired token with AFOAuth2Manager?
我正在为受 OAuth2 保护的服务器编写一个小型 iOS 客户端。
我想知道是否可以使用 AFOAuth2Manager
[here] 自动刷新过期的令牌。
这个想法是,当服务器响应 401 时刷新客户端的逻辑,或者当刷新方法 returns 出现 401 时引发错误的逻辑应该很常见,所以它可能集成在某些图书馆。
不幸的是,我没有找到解决这个问题的任何框架,所以我写了一个关于 AFNetworking
的简短包装(如果有人感兴趣,我可以在 github 上发布)
逻辑是执行请求,如果是http响应401
,尝试刷新auth-token,完成后重新执行之前的请求。
我创建了 AFOAuth2Manager
的子class
在这个子class中我覆盖了这个方法:
- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure {
return [self HTTPRequestOperationWithRequest:request
success:success
failure:failure
checkIfTokenIsExpired:YES];
}
调用带有附加参数的自定义方法:checkIfTokenIsExpired
。这是为了避免无限循环所必需的。
此方法的实现是直接的:如果我们不需要检查令牌,只需调用超级 class.
if (!checkIfTokenIsExpired) {
return [super HTTPRequestOperationWithRequest:request
success:success
failure:failure];
}
否则我们使用自定义失败块执行请求
else {
return [super HTTPRequestOperationWithRequest:request
success:success
failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
if (operation.response.statusCode == ERROR_CODE_UNAUTHORIZED) { //1
[self reauthorizeWithSuccess: ^{ //2
NSURLRequest *req = [self.requestSerializer requestByAddingHeadersToRequest:request]; //3
AFHTTPRequestOperation *moperation = [self HTTPRequestOperationWithRequest:req //4
success:success
failure:failure
checkIfTokenIsExpired:NO];
[self.operationQueue addOperation:moperation]; //5
} failure: ^(NSError *error) {
failure(nil, error);
}];
}
else {
failure(operation, error); //6
}
}];
}
- //1:检查
http status code
,如果401尝试自动re-authorize.
- //2:reauthorize是私有方法,使用
AFOAuthManager
刷新token
- //3:在这种情况下,我们 re-authorized 成功了,我们想重新提交先前请求的副本。方法
requestByAddingHeadersToRequest:
只是从上一个请求中复制所有 header 字段。
- //4: 创建之前请求的副本,但是这次最后一个参数为false,因为我们不想再次检查!
successBlock
和 failureBlock
与之前的请求相同。
- //5: 添加操作到queue.
- //6:如果reauthorize方法失败了就调用失败块。
我正在寻找这个问题的答案 "Matt", the creator of AFNetworking, suggest this:
the best solution I've found for dealing with this is to use dependent
NSOperations to check for a valid, un-expired token before any
outgoing request is allowed to go through. At that point, it's up to
the developer to determine the best course of action for refreshing
the token, or acquiring a new one in the first place.
简单,但有效?,现在尝试,将编辑报告...
Swift Alamofire 4.0 的解决方案。基于 RequestAdapter 和 RequestRetrier 协议:example link
我正在为受 OAuth2 保护的服务器编写一个小型 iOS 客户端。
我想知道是否可以使用 AFOAuth2Manager
[here] 自动刷新过期的令牌。
这个想法是,当服务器响应 401 时刷新客户端的逻辑,或者当刷新方法 returns 出现 401 时引发错误的逻辑应该很常见,所以它可能集成在某些图书馆。
不幸的是,我没有找到解决这个问题的任何框架,所以我写了一个关于 AFNetworking
的简短包装(如果有人感兴趣,我可以在 github 上发布)
逻辑是执行请求,如果是http响应401
,尝试刷新auth-token,完成后重新执行之前的请求。
我创建了 AFOAuth2Manager
在这个子class中我覆盖了这个方法:
- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure {
return [self HTTPRequestOperationWithRequest:request
success:success
failure:failure
checkIfTokenIsExpired:YES];
}
调用带有附加参数的自定义方法:checkIfTokenIsExpired
。这是为了避免无限循环所必需的。
此方法的实现是直接的:如果我们不需要检查令牌,只需调用超级 class.
if (!checkIfTokenIsExpired) {
return [super HTTPRequestOperationWithRequest:request
success:success
failure:failure];
}
否则我们使用自定义失败块执行请求
else {
return [super HTTPRequestOperationWithRequest:request
success:success
failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
if (operation.response.statusCode == ERROR_CODE_UNAUTHORIZED) { //1
[self reauthorizeWithSuccess: ^{ //2
NSURLRequest *req = [self.requestSerializer requestByAddingHeadersToRequest:request]; //3
AFHTTPRequestOperation *moperation = [self HTTPRequestOperationWithRequest:req //4
success:success
failure:failure
checkIfTokenIsExpired:NO];
[self.operationQueue addOperation:moperation]; //5
} failure: ^(NSError *error) {
failure(nil, error);
}];
}
else {
failure(operation, error); //6
}
}];
}
- //1:检查
http status code
,如果401尝试自动re-authorize. - //2:reauthorize是私有方法,使用
AFOAuthManager
刷新token - //3:在这种情况下,我们 re-authorized 成功了,我们想重新提交先前请求的副本。方法
requestByAddingHeadersToRequest:
只是从上一个请求中复制所有 header 字段。 - //4: 创建之前请求的副本,但是这次最后一个参数为false,因为我们不想再次检查!
successBlock
和failureBlock
与之前的请求相同。 - //5: 添加操作到queue.
- //6:如果reauthorize方法失败了就调用失败块。
我正在寻找这个问题的答案 "Matt", the creator of AFNetworking, suggest this:
the best solution I've found for dealing with this is to use dependent NSOperations to check for a valid, un-expired token before any outgoing request is allowed to go through. At that point, it's up to the developer to determine the best course of action for refreshing the token, or acquiring a new one in the first place.
简单,但有效?,现在尝试,将编辑报告...
Swift Alamofire 4.0 的解决方案。基于 RequestAdapter 和 RequestRetrier 协议:example link