的OAuth 2承载授权报头(OAuth 2 bearer Authorization header

2019-07-31 04:00发布

随着更新到客户端的API的HTTPBasicAuthication方法已经用了OAuth2更换Bearer Authorization头。

随着旧的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头。

现在通常我只会把它加像这样添加标题我自己:

NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token];
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];

但有了这个解决方案的问题是,API重定向大部分调用其它的URL,这与安全性有关。 在之后NSURLRequest被重定向的授权头从请求中删除,因为我无法承载方法添加到NSURLCredentialStorage被重定向后,无法验证了。

这将是一个很好的解决方案? 我只能想到赶上重定向和修改NSURLRequest所以它包括Bearer头。 怎么会呢?

Answer 1:

经过大量的研究嗯,我发现,我将只需要更换NSURLRequest当呼叫被重定向。

不是像你一样,我想它是,但没有工作。

我用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;

}];


Answer 2:

我使用AFNetworking库

查找AFHttpClient.m和你有一个方法

- (void)setAuthorizationHeaderWithToken:(NSString *)token {
    [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Token token=\"%@\"", token]];
}

具有以下或更换此方法,如果你需要它的背面兼容性保持它的使用不同的名称添加和使用该名称

- (void)setAuthorizationHeaderWithToken:(NSString *)token {
    [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Bearer %@", token]];
}

然后进行与OAuth访问令牌的请求。 (下面是一个GET方法服务)

    NSURL *url = [EFServiceUrlProvider getServiceUrlForMethod:methodName];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    [httpClient setAuthorizationHeaderWithToken:@"add your access token here"];

    [httpClient getPath:@"" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *response = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //
    }];

更新


使用OAuth2用户端上AFNetworking写的亚光

https://github.com/AFNetworking/AFOAuth2Client



Answer 3:

如果你碰巧有Django的REST框架,问题可能与结尾的斜线路由器通过的NSURLRequest被修剪这个问题。 如果斜线被剪裁的Django然后将重定向您的要求,以避免这一点,你可以使用Trailing_slash =真喜欢这个

router = routers.DefaultRouter(trailing_slash=False)

这样,不是你的授权头也不是你的参数会迷路。

希望这样可以节省别人一些时间。



文章来源: OAuth 2 bearer Authorization header