13

クライアントのAPIの更新により、HTTPBasicAuthicationメソッドがOAuth2AuthorizationBearerヘッダーに置き換えられました。

古い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、Authorizationヘッダーはリクエストから削除され、Bearerメソッドを追加できないため、NSURLCredentialStorageリダイレクトされた後は認証できなくなります。

良い解決策は何でしょうか?リダイレクトをキャッチして変更することしか考えられないので、ヘッダーNSURLRequestが含まれています。Bearerしかし、どのように?

4

3 に答える 3

16

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;

}];
于 2012-08-24T12:46:57.783 に答える
4

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) {
        //
    }];

更新しました


mattによって作成されたAFNetworkingでOauth2クライアントを使用する

https://github.com/AFNetworking/AFOAuth2Client

于 2012-11-23T13:05:32.717 に答える
1

Djangoレストフレームワークとルーターでこの問題が発生している場合、問題はNSUrlRequestによってクリップされている末尾のスラッシュに関連している可能性があります。末尾のスラッシュがクリップされている場合、djangoはリクエストをリダイレクトする必要があります。これを回避するには、Trailing_slash=Trueを次のように使用できます。

router = routers.DefaultRouter(trailing_slash=False)

そうすれば、認証ヘッダーもパラメーターも失われません。

これが誰かの時間を節約することを願っています。

于 2014-03-20T14:52:32.823 に答える