ios – OAuth 2承载授权头

通过对客户端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,所以它包括承载头.但是怎么样

解决方法

经过很多研究,我发现我只需在重定向呼叫时更换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;

    }];

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...