随着客户端 API 的更新,HTTPBasicAuthication 方法已替换为 OAuth2Bearer
授权标头。
使用旧的 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];
但这不适用于Bearer
header.
现在通常我会自己添加标题,如下所示:
NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token];
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];
但这个解决方案的问题是 API 将大部分调用重定向到其他 URL,这与安全性有关。
之后NSURLRequest
被重定向,授权标头已从请求中删除,因为我无法将 Bearer 方法添加到NSURLCredentialStorage
重定向后无法再进行身份验证。
什么是好的解决方案?我只能想到捕捉重定向并修改NSURLRequest
所以它确实包括Bearer
标头。但如何呢?
经过大量研究后,我发现我只需要更换NSURLRequest
当呼叫被重定向时。
没有我想要的那么好,但确实有效。
I used AFNetworking
并添加重定向块,然后检查是否Authorization
标题仍然设置,如果没有我创建一个新的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;
}];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)