我正在为受 OAuth2 保护的服务器编写一个小型 iOS 客户端。
我想知道是否可以使用AFOAuth2Manager
[here] https://github.com/AFNetworking/AFOAuth2Manager自动刷新过期的令牌。
这个想法是,当服务器响应 401 时刷新客户端的逻辑,或者当刷新方法返回 401 时引发错误的逻辑应该很常见,因此可能它集成在某些库中。
我创建了一个子类AFOAuth2Manager
在这个子类中我重写这个方法:
- (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
。这是为了避免无限循环所必需的。
这个方法的实现很简单:如果我们不需要检查令牌,只需调用超类。
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尝试自动重新授权。
- //2: 重新授权是一个私有方法,使用
AFOAuthManager
刷新令牌。
- //3:在这种情况下,我们重新授权成功,并且我们想要重新提交先前请求的副本。方法
requestByAddingHeadersToRequest:
只需复制上一个请求中的所有标头字段即可。
- //4: 创建上一个请求的副本,但这次最后一个参数为 false,因为我们不想再次检查!这
successBlock
and failureBlock
与之前的请求相同。
- //5: 将操作添加到队列中。
- //6: 如果重新授权方法失败,则调用失败块。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)