API失败时动态刷新身份验证令牌并重试失败的

时间:2016-09-02 12:28:11

标签: objective-c afnetworking-3

我有一个定期到期的令牌。我正在使用AFNetworking 3.0

步骤:

  1. API称为
  2. 令牌已过期且401发生。
  3. 需要提取令牌
  4. 使用新令牌继续API调用
  5. 考虑到后端可以更改令牌到期时间,我该怎么做?

1 个答案:

答案 0 :(得分:0)

通常,您将拥有一个API客户端类,您的所有网络请求都会漏斗通过,以便您可以捕获401失败,在标题中解析它们过期的令牌消息(这样您就可以允许真正的401通过)并在重试原始请求之前刷新您的令牌。

您可以更进一步,使用会话管理器防止其他请求在令牌完全刷新之前发出,但您基本上只需要在请求返回时添加刷新逻辑并重试原始请求。

以下是我如何处理它的粗略概念。

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:newRequest completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (response) {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            NSString *headerError = [httpResponse.allHeaderFields objectForKey:@"Www-Authenticate"];
            if (headerError) {
                if ([headerError rangeOfString:@"The access token expired"].location != NSNotFound) {
                    //refresh here

                    // exit to avoid calling completion handler
                    return;
                }
            } else {
                if (httpResponse.statusCode == 401) {
                    // user does not have access
                    NSLog(@"Unauthorized Network Request");
                }
            }
        }

        if (completionHandler) {
            completionHandler(response,responseObject,error);
        }
    }];

    [dataTask resume];