OAuth 2 заголовок авторизации носителя

С обновлением API клиента метод HTTPBasicAuthication был заменен на OAuth2. Bearer Заголовок авторизации.

Со старым 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 перенаправляется, заголовок авторизации удаляется из запроса, и так как я не могу добавить метод Bearer в NSURLCredentialStorage он не может больше аутентифицироваться после перенаправления.

Какие бы были хорошие решения? Я могу только думать, чтобы поймать перенаправление и изменить NSURLRequest так что это включает в себя Bearer заголовок. Но как?

3 ответа

Решение

Ну, после долгих исследований я обнаружил, что мне просто придется заменить 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;

}];

Я использую AFNetworking Library

Найдите 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 Client на AFNetworking, написанный Мэттом

https://github.com/AFNetworking/AFOAuth2Client

Если у вас возникла эта проблема с каркасом отдыха Django и маршрутизаторами, проблема может быть связана с конечной косой чертой, обрезанной NSUrlRequest. если косая черта обрезана, тогда django придется перенаправить ваш запрос, чтобы избежать этого, вы можете использовать Trailing_slash = True, как это

router = routers.DefaultRouter(trailing_slash=False)

Таким образом, ни ваш заголовок авторизации, ни ваши параметры не будут потеряны.

Надеюсь, это сэкономит кому-то время.

Другие вопросы по тегам