[iOS-Foundation] Networking Authentication

當(dāng)發(fā)送 HTTPS 請求時(shí),在握手階段服務(wù)器可能要求客戶端提供證書用來證明身份辫塌⊥缯眨或者在 HTTP 協(xié)議層,服務(wù)器可通過響應(yīng)頭WWW-Authenticate要求驗(yàn)證客戶端身份啊楚。在使用 URL Loading System 發(fā)送網(wǎng)絡(luò)請求時(shí),當(dāng)遇到上述情況時(shí)浑彰,系統(tǒng)會調(diào)用 URLSession 對象的代理的
URLSession:didReceiveChallenge:completionHandler:
URLSession:task:didReceiveChallenge:completionHandler:方法恭理。另外在 SSL/TLS 協(xié)議中,客戶端在握手階段驗(yàn)證服務(wù)器證書時(shí)闸昨,也會調(diào)用上述代理方法蚯斯。

代理方法中的參數(shù) challenge 是一個(gè)NSURLAuthenticationChallenge對象,該類封裝了請求驗(yàn)證的信息饵较。所以一般情況下拍嵌,應(yīng)用不需要自己創(chuàng)建該類型對象,只有在使用自定義協(xié)議時(shí)循诉,則可能需要主動(dòng)創(chuàng)建横辆。

NSURLAuthenticationChallenge

NSURLAuthenticationChallenge 類中最重要的一個(gè)屬性是protectionSpace,該屬性是一個(gè) NSURLProtectionSpace 的實(shí)例茄猫,一個(gè)NSURLProtectionSpace對象通過屬性host狈蚤、isProxyport划纽、protocol脆侮、proxyTyperealm代表了請求驗(yàn)證的服務(wù)器端的范圍。而NSURLProtectionSpace類的authenticationMethod屬性則指明了服務(wù)端的驗(yàn)證方式勇劣,可能的值包括

NSURLAuthenticationMethodDefault
// 基本的 HTTP 驗(yàn)證靖避,通過 NSURLCredential 對象提供用戶名和密碼潭枣。
NSURLAuthenticationMethodHTTPBasic
// 類似于基本的 HTTP 驗(yàn)證,摘要會自動(dòng)生成幻捏,同樣通過 NSURLCredential 對象提供用戶名和密碼盆犁。
NSURLAuthenticationMethodHTTPDigest
// 不會用于 URL Loading System,在通過 web 表單驗(yàn)證時(shí)可能用到篡九。
NSURLAuthenticationMethodHTMLForm
NSURLAuthenticationMethodNegotiate
NSURLAuthenticationMethodNTLM
// 驗(yàn)證客戶端的證書
NSURLAuthenticationMethodClientCertificate
// 指明客戶端要驗(yàn)證服務(wù)端提供的證書
NSURLAuthenticationMethodServerTrust

除了protectionSpace谐岁,NSURLAuthenticationChallenge還包括以下幾項(xiàng)屬性:

  • proposedCredential,從名字就可以看出榛臼,推薦的證書說明該屬性是一個(gè)
    NSURLCredential對象伊佃。可能是根據(jù)protectionSpace讽坏,從
    [NSURLCredentialStorage sharedCredentialStorage]獲取到的锭魔。也可能是之前驗(yàn)證失敗的證書例证。如果是客戶端要驗(yàn)證服務(wù)端提供的證書路呜,則該屬性代表了服務(wù)器提供的證書。
  • failureResponse织咧,指明上一次驗(yàn)證失敗的NSURLResponse對象胀葱。
  • previousFailureCount,之前嘗試驗(yàn)證失敗的次數(shù)笙蒙。
  • sender抵屿,實(shí)現(xiàn)NSURLAuthenticationChallengeSender協(xié)議的對象,一般是一個(gè)NSURLProtocol的實(shí)例捅位,在老版本的NSURLConnectionNSURLDownload中轧葛,代理方法并不提供 completionHandler 參數(shù),而是需要調(diào)用
    NSURLAuthenticationChallengeSender協(xié)議定義的相關(guān)方法艇搀。
  • error尿扯,指明上一次驗(yàn)證失敗的NSError對象。

NSURLSessionAuthChallengeDisposition

NSURLSession的代理方法中執(zhí)行相應(yīng)的邏輯后焰雕,需調(diào)用代理方法的 block 參數(shù) completionHandler衷笋,來通知系統(tǒng)如何處理驗(yàn)證。該 block 需要傳入兩個(gè)參數(shù)矩屁,NSURLSessionAuthChallengeDisposition類型的 disposition辟宗,說明處理的方式,另一個(gè)參數(shù)是對應(yīng)的NSURLCredential對象吝秕。
NSURLSessionAuthChallengeDisposition可能的值包括:

// 指明通過另一個(gè)參數(shù) credential 提供證書
NSURLSessionAuthChallengeUseCredential
// 相當(dāng)于未執(zhí)行代理方法泊脐,使用默認(rèn)的處理方式,不使用參數(shù) credential
NSURLSessionAuthChallengePerformDefaultHandling
// 拒絕該 protectionSpace 的驗(yàn)證烁峭,不使用參數(shù) credential
NSURLSessionAuthChallengeRejectProtectionSpace
// 取消驗(yàn)證容客,不使用參數(shù) credential
NSURLSessionAuthChallengeCancelAuthenticationChallenge

NSURLCredential

當(dāng) disposition 的值為 NSURLSessionAuthChallengeUseCredential時(shí),需要提供一個(gè) NSURLCredential 對象≡胖可以創(chuàng)建3種類型的 Credential:

// 當(dāng) protectionSpace 的 authenticationMethod 的值為 NSURLAuthenticationMethodHTTPBasic 或 NSURLAuthenticationMethodHTTPDigest 時(shí)
+ credentialWithUser:password:persistence:
- initWithUser:password:persistence:
// 當(dāng) protectionSpace 的 authenticationMethod 的值為 NSURLAuthenticationMethodClientCertificate 時(shí)
+ credentialWithIdentity:certificates:persistence:
- initWithIdentity:certificates:persistence:
// 當(dāng) protectionSpace 的 authenticationMethod 的值為 NSURLAuthenticationMethodServerTrust 時(shí)
+ credentialForTrust:
- initWithTrust:

另外如捅,可通過 NSURLCredentialStorage 管理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末调煎,一起剝皮案震驚了整個(gè)濱河市镜遣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌士袄,老刑警劉巖悲关,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娄柳,居然都是意外死亡寓辱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門赤拒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秫筏,“玉大人,你說我怎么就攤上這事挎挖≌饩矗” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵蕉朵,是天一觀的道長崔涂。 經(jīng)常有香客問我,道長始衅,這世上最難降的妖魔是什么冷蚂? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮汛闸,結(jié)果婚禮上蝙茶,老公的妹妹穿的比我還像新娘。我一直安慰自己蛉拙,他們只是感情好尸闸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孕锄,像睡著了一般吮廉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畸肆,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天宦芦,我揣著相機(jī)與錄音,去河邊找鬼轴脐。 笑死调卑,一個(gè)胖子當(dāng)著我的面吹牛抡砂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恬涧,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼注益,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溯捆?” 一聲冷哼從身側(cè)響起丑搔,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎提揍,沒想到半個(gè)月后啤月,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劳跃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年谎仲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刨仑。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郑诺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贸人,到底是詐尸還是另有隱情间景,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布艺智,位于F島的核電站,受9級特大地震影響圾亏,放射性物質(zhì)發(fā)生泄漏十拣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一志鹃、第九天 我趴在偏房一處隱蔽的房頂上張望夭问。 院中可真熱鬧,春花似錦曹铃、人聲如沸缰趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秘血。三九已至,卻和暖如春评甜,著一層夾襖步出監(jiān)牢的瞬間灰粮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工忍坷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘舟,地道東北人熔脂。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像柑肴,于是被迫代替她去往敵國和親霞揉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容