如何使用AFOAuth2Manager自动刷新过期的令牌?

时间:2015-03-09 15:58:57

标签: ios oauth-2.0 afnetworking afnetworking-2

我正在为受OAuth2保护的服务器编写一个小型iOS客户端。

我想知道是否可以使用AFOAuth2Manager [here]自动刷新过期的令牌。

这个想法是当服务器用401响应时刷新客户端的逻辑,或者当刷新方法返回401时引发错误的逻辑应该很常见,所以它可能集成在某个库中。

4 个答案:

答案 0 :(得分:14)

我创建了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,因为我们不想再次检查! successBlockfailureBlock与之前的请求相同。
  • // 5:将操作添加到队列中。
  • // 6:如果重新授权方法失败,则只需调用失败块。

答案 1 :(得分:2)

不幸的是我没有找到解决这个问题的任何框架所以我在AFNetworking附近编写了一个简短的包装器(如果有兴趣我可以在github上发布) 逻辑是执行请求,并且在http响应401的情况下,尝试刷新auth-token,并在完成后重新执行先前的请求。

答案 2 :(得分:0)

我正在搜索此问题的答案并"Matt", the creator of AFNetworking, suggest this

  

我发现处理这个问题的最佳解决方案是使用依赖   NSOperations在任何之前检查有效的,未过期的令牌   允许传出请求通过。在那一点上,它取决于   开发人员确定刷新的最佳行动方案   令牌,或者首先获得一个新令牌。

简单但有效?现在尝试,将使用报告编辑...

答案 3 :(得分:0)

带有 Alamofire 4.0的

Swift 解决方案。基于RequestAdapter和RequestRetrier协议:example link