2

AFNetworking と同じリクエストで Basic および OAuth 認証ヘッダーを使用することは可能ですか (上書きを回避します)?

私はこのコードを持っています:

NSURL *url = [NSURL URLWithString:@"https://www.infojobs.net/"];
AFOAuth2Client *OAuthClient = [[AFOAuth2Client alloc] initWithBaseURL:url clientID:kClientID secret:kClientSecret];

[OAuthClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

[OAuthClient authenticateUsingOAuthWithPath:@"oauth/authorize" code:self.authorizationCode redirectURI:kInfoJobsRedirectURLString success:^(AFOAuthCredential *credential) {
    NSLog(@"Credentials: %@", credential.accessToken);
    if (![credential.accessToken isEqualToString:@""]) {
        self.isAuthenticated = YES;

        [AFOAuthCredential storeCredential:credential withIdentifier:@"kInfoJobsAccessToken"];


        [[InfoJobsAPI sharedClient] setAuthorizationHeaderWithToken:credential.accessToken];

        // (!) This overwrites the Authorization header set with the accessToken
        [[InfoJobsAPI sharedClient] setAuthorizationHeaderWithUsername:kClientID password:kClientSecret];   

        success(credential);

    }
} failure:^(NSError *error) {
    NSLog(@"Error: %@", error.localizedDescription);

}];

そして、次のようなリクエストが必要です。

GET /api/1/application HTTP/1.1
Host: api.infojobs.net
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Authorization: OAuth 07d18fac-77ea-461f-9bfe-a5e9d98deb3d
....

しかし、ドキュメントに見られるように、AFNetworking がこのヘッダーを上書きするように見えるため、同じ要求で "Basic" および "OAuth" Authorization ヘッダーを設定することはできません。

"Basic" と "OAuth" を同じ Authorization ヘッダーで使用することは可能ですが、おそらく両方を "\n" で分割しますか?

ありがとう、そして私の下手な英語でごめんなさい


編集

最後に、同じヘッダーで「Basic」認証と「Oauth」認証を使用できます。コードは次のとおりです。

[[InfoJobsAPI sharedClient] setAuthorizationHeaderWithUsername:kClientID password:kClientSecret];

AFOAuthCredential *credential = [AFOAuthCredential retrieveCredentialWithIdentifier:@"kInfoJobsAccessToken"];

NSMutableURLRequest *request = [self requestWithMethod:@"GET" path:@"/api/2/candidate" parameters:nil];

[request addValue:[NSString stringWithFormat:@"OAuth %@", credential.accessToken] forHTTPHeaderField:@"Authorization"];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    DLog(@"Response : %@",JSON);
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    DLog(@"Error : %@",error);
}];

[operation start];
4

1 に答える 1

1

HTTP 仕様によると、1 つの要求に含めることができるAuthorizationヘッダーは 1 つだけです。したがって、ライブラリが示している動作は、その仕様に従って正しいものです。2 番目の への呼び出しはsetAuthorizationHeader...、前の呼び出しを上書きします。

通常、HTTP で見られるのは、サーバーが受け入れることができる承認プロトコルをクライアントに伝えるハンドシェーク フェーズがあることです。その後、クライアントはこれらのプロトコルから、使用するプロトコルを選択できます。

于 2012-12-11T12:54:52.070 に答える