通过对客户端API的更新,HTTPBasicAuthication方法已被替换为OAuth2承载授权头.
使用旧API,我将执行以下操作:
NSURLCredential *credential = [NSURLCredential credentialWithUser:self.account.username password:self.account.token persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace *space = [[NSURLProtectionSpace alloc] initWithHost:kAPIHost port:443 protocol:NSURLProtectionSpaceHTTPS realm:@"my-api" authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
但这不会与承载头部一起使用.
NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token]; [urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];
但这个解决方案的问题是API将大部分调用重定向到其他URL,这与安全性有关.
NSURLRequest被重定向后,授权头将从请求中删除,并且由于我无法将承载方法添加到NSURLCredentialStorage,所以在重定向后不能再进行身份验证.
解决方法
经过很多研究,我发现我只需在重定向呼叫时更换NSURLRequest.
不如我想要的那样好,但是做得很好.
我使用AFNetworking并添加了重定向块,然后检查如果不是我创建一个新的NSMutableURLRequest并且设置所有的属性以匹配旧的请求,授权头仍然设置(我知道我可以刚刚创建一个可变的副本):
[requestOperation setRedirectResponseBlock:^NSURLRequest *(NSURLConnection *connection,NSURLRequest *request,NSURLResponse *redirectResponse) { if ([request.allHTTPHeaderFields objectForKey:@"Authorization"] != nil) { return request; } NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:request.URL cachePolicy:request.cachePolicy timeoutInterval:request.timeoutInterval]; NSString *authValue = [NSString stringWithFormat:@"Bearer %@",self.account.token]; [urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"]; return urlRequest; }];