3

ユーザーにログインし、そのユーザーを で認証する iOS アプリがありますappKeydidReceiveAuthenticationChallengeデリゲート メソッド onは、NSURLConnectionユーザー名/パスワードにNSURLCredential. ただし、 (2つではなく、1つの認証データのみ)NSURLCredentialのみでを作成するのに問題があります。キーのみをappKey使用してサーバーに認証の詳細を提供する方法はありますか?NSURLConnection

次のリクエストは、パスワードを指定せcurlずに を指定するだけで完全に機能します。appKey

curl -u <app key>: -H "Accept: application/json" https://dev.sitename.com/api/v1/webpage -v

これは、上記のcURL認証部分を Objective-C に変換した方法です。

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    // Authenticate the user with AppKey based on the credentials provided
    if ([challenge previousFailureCount] == 0) {
        NSURLCredential *credential = [NSURLCredential credentialWithUser:[keychainItem objectForKey:@"APP KEY"] password:nil persistence:NSURLCredentialPersistenceForSession];
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    }
}

これは機能するはずですが、試行するたびに認証が失敗します。ご覧のとおり、passwordパラメーターを に設定しましたnil。また、両方のパラメーターを入力してみました。何も機能していないようです。

を使用してサーバーに1つのパラメーターのみを渡す方法についてのアイデアはありますNSURLConnectionか? デリゲート メソッドからエラー情報を取得する方法はありますかdidReceiveAuthenticationChallenge(私は認識していdidReceiveResponseます)。

4

1 に答える 1

2

これは の文書化されていない動作のようです:パスワードとしてNSURLCredentialに渡し、この資格情報を使用して認証チャレンジに応答すると、iOS は資格情報を完全に無視します。nilcredentialWithUser:password:persistence:

解決策は、パスワードを使用したくない場合に をnil空のNSString( )に置き換えることです。@""

したがって、コードは次のようになります。

NSURLCredential *credential = [NSURLCredential credentialWithUser:[keychainItem objectForKey:@"APP KEY"] password:@"" persistence:NSURLCredentialPersistenceForSession];

これは、nilパスワードを使用してnginxのログから取得したものです。

xxx.xxx.xxx.xxx - - [18/Aug/2013:23:21:14 +0200] "GET /tmp HTTP/1.1" 401 188 "-" "test/1.0 CFNetwork/609.1.4 Darwin/12.4.0"

空の文字列 (apikeyチャレンジへの応答で使用されるユーザー名) の場合:

xxx.xxx.xxx.xxx - apikey [18/Aug/2013:23:21:16 +0200] "GET /tmp HTTP/1.1" 200 136 "-" "test/1.0 CFNetwork/609.1.4 Darwin/12.4.0"
于 2013-08-18T21:37:30.967 に答える