![](/img/trans.png)
[英]How to remove NSURLCredential storage for https authentication in iOS
[英]NSURLCredential Authentication with only one key
我有一個iOS應用程序登錄用戶,然后使用appKey
對該用戶進行身份驗證。 在didReceiveAuthenticationChallenge
上委托方法NSURLConnection
是足以提供用戶名/密碼與NSURLCredential
。 但是,我在創建僅使用appKey
的NSURLCredential
時遇到了麻煩(只有一個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.