簡體   English   中英

僅使用一個密鑰進行NSURLCredential身份驗證

[英]NSURLCredential Authentication with only one key

我有一個iOS應用程序登錄用戶,然后使用appKey對該用戶進行身份驗證。 didReceiveAuthenticationChallenge上委托方法NSURLConnection是足以提供用戶名/密碼與NSURLCredential 但是,我在創建僅使用appKeyNSURLCredential時遇到了麻煩(只有一個auth數據,而不是兩個)。 無論如何,只使用密鑰為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 我也試過填寫這兩個參數。 似乎沒什么用。

關於如何只使用NSURLConnection將一個參數傳遞給服務器的任何想法? 有沒有辦法從didReceiveAuthenticationChallenge委托方法獲取錯誤信息(我知道didReceiveResponse )?

這似乎是NSURLCredential的未記錄行為:當將nil作為密碼傳遞給credentialWithUser:password:persistence: ,並使用此憑據來響應身份驗證質詢時,iOS會完全忽略該憑據。

解決方案是在您不想使用密碼時用空的NSString@"" )替換nil

所以你的代碼應該是這樣的:

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

這是我從nginx的日志中獲得的nil密碼:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM