详细解析几个和网络请求有关的类(十八) —— NSURLAuthenticationChallenge(一)

版本记录

版本号 时间
V1.0 2018.03.16

前言

我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
4. 详细解析几个和网络请求有关的类(四) —— NSURLSession和NSURLConnection的区别
5. 详细解析几个和网络请求有关的类(五) —— 关于NSURL加载系统(一)
6. 详细解析几个和网络请求有关的类(六) —— 使用NSURLSession(二)
7. 详细解析几个和网络请求有关的类(七) —— URL数据的编码和解码(三)
8. 详细解析几个和网络请求有关的类(八) —— 处理重定向和其他请求更改(四)
9. 详细解析几个和网络请求有关的类(九) —— 身份验证挑战和TLS链验证(五)
10. 详细解析几个和网络请求有关的类(十) —— 理解获取缓存(六)
11. 详细解析几个和网络请求有关的类(十一) —— Cookies和自定义协议(七)
12. 详细解析几个和网络请求有关的类(十二) —— URL Session的生命周期(八)
13. 详细解析几个和网络请求有关的类(十三) —— NSURLResponse(一)
14. 详细解析几个和网络请求有关的类(十四) —— NSHTTPCookie(一)
15. 详细解析几个和网络请求有关的类(十五) —— NSHTTPCookieStorage(一)
16. 详细解析几个和网络请求有关的类(十六) —— NSURLCache(一)
17. 详细解析几个和网络请求有关的类(十七) —— NSCachedURLResponse(一)

回顾

上一篇讲述了NSCachedURLResponse这个类的详细信息以及一些注意要点,下面这篇我们就主要看一下NSURLAuthenticationChallenge


Overview

先看一个该类的基本信息。

大多数应用程序本身不会创建认证挑战。但是,在添加对自定义网络协议的支持时,您可能需要创建身份验证质询对象,作为自定义NSURLProtocol子类的一部分。

相反,您的应用在各种NSURLSessionNSURLConnectionNSURLDownload代理方法(如URLSession:task:didReceiveChallenge:completionHandler:)中接收到认证挑战。这些对象提供了在决定如何处理服务器的身份验证请求时所需的信息。该认证挑战的核心是一个保护空间,该空间定义所请求的认证类型,主机和端口号,网络协议和(在适用的情况下)认证领域(一组相关服务器上的相关URL一组凭据)。

您的应用通过提供NSURLCredential对象来响应身份验证挑战。细节取决于您使用的API和挑战类型。

在较高层次上,如果您向服务器或代理提供用户凭据,proposedCredential方法将提供一个凭证,该凭证与保护空间中指定的条件相匹配,从处理请求的NSURLCredentialStorage类中检索(假设存在此凭据) 。

如果previousFailureCount方法返回0并且提出的凭证存在,提出的凭证尚未尝试,这意味着您应该尝试。如果它返回非零结果,那么服务器已经拒绝了建议的凭证,并且您应该使用该凭证来填充密码或证书选择器对话框,然后提供新的凭证。您可以通过调用credentialWithUser:password:persistence:方法创建基于密码的凭证,或使用 credentialWithIdentity:certificates:persistence:创建基于证书的凭证。

如果身份验证的保护空间使用NSURLAuthenticationMethodServerTrust身份验证方法,则请求会要求您验证服务器的真实性。在这种情况下,proposedCredential方法提供基于服务器作为其初始TLS握手的一部分提供的证书的凭证。大多数应用程序应基于服务器信任保护空间请求对身份验证挑战的默认处理,但如果您需要覆盖默认的TLS验证行为,则可以按照Overriding TLS Chain Validation Correctly中所述执行此操作。

有关URL会话如何处理不同类型的身份验证挑战的更多信息,请参阅NSURLSessionURL Session Programming Guide


Topics

1. Creating an authentication challenge instance - 创建一个认证挑战实例

2. Getting authentication challenge properties - 获取认证挑战属性


API

1. NSURLAuthenticationChallenge类

@class NSURLAuthenticationChallengeInternal;

/*!
    @class NSURLAuthenticationChallenge
    @discussion This class represents an authentication challenge. It
    provides all the information about the challenge, and has a method
    to indicate when it's done.
*/

@interface NSURLAuthenticationChallenge : NSObject <NSSecureCoding>
{
@private
    NSURLAuthenticationChallengeInternal *_internal;
}

/*!
    @method initWithProtectionSpace:proposedCredential:previousFailureCount:failureResponse:error:
    @abstract Initialize an authentication challenge 
    @param space The NSURLProtectionSpace to use
    @param credential The proposed NSURLCredential for this challenge, or nil
    @param previousFailureCount A count of previous failures attempting access.
    @param response The NSURLResponse for the authentication failure, if applicable, else nil
    @param error The NSError for the authentication failure, if applicable, else nil
    @result An authentication challenge initialized with the specified parameters
*/
// 实例化一个验证挑战对象

- (instancetype)initWithProtectionSpace:(NSURLProtectionSpace *)space proposedCredential:(nullable NSURLCredential *)credential previousFailureCount:(NSInteger)previousFailureCount failureResponse:(nullable NSURLResponse *)response error:(nullable NSError *)error sender:(id<NSURLAuthenticationChallengeSender>)sender;

/*!
    @method initWithAuthenticationChallenge:
    @abstract Initialize an authentication challenge copying all parameters from another one.
    @result A new challenge initialized with the parameters from the passed in challenge
    @discussion This initializer may be useful to subclassers that want to proxy
    one type of authentication challenge to look like another type.
*/
// 初始化认证挑战,从另一个参数复制所有参数、
// 此初始化程序可能对希望代理一种类型的认证挑战以使其看起来像另一种类型的子级别者有用

- (instancetype)initWithAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge sender:(id<NSURLAuthenticationChallengeSender>)sender;

/*!
    @abstract Get a description of the protection space that requires authentication
    @result The protection space that needs authentication
*/
// 获取一个需要认证的保护空间的描述

@property (readonly, copy) NSURLProtectionSpace *protectionSpace;

/*!
    @abstract Get the proposed credential for this challenge
    @result The proposed credential
    @discussion proposedCredential may be nil, if there is no default
    credential to use for this challenge (either stored or in the
    URL). If the credential is not nil and returns YES for
    hasPassword, this means the NSURLConnection thinks the credential
    is ready to use as-is. If it returns NO for hasPassword, then the
    credential is not ready to use as-is, but provides a default
    username the client could use when prompting.
*/
// 获取此挑战的建议凭据
// 如果没有默认凭据用于此挑战(存储或在URL中),则建议的认证可能为nil。 
// 如果凭证不为nil并且hasPassword返回YES,这意味着NSURLConnection认为凭证可以按原样使用。 
// 如果它返回NO作为hasPassword,那么凭证尚未准备就绪,但提供了一个默认用户名,客户端可以在提示时使用该用户名。

@property (nullable, readonly, copy) NSURLCredential *proposedCredential;

/*!
    @abstract Get count of previous failed authentication attempts
    @result The count of previous failures
*/
// 以前尝试验证失败的次数

@property (readonly) NSInteger previousFailureCount;

/*!
    @abstract Get the response representing authentication failure.
    @result The failure response or nil
    @discussion If there was a previous authentication failure, and
    this protocol uses responses to indicate authentication failure,
    then this method will return the response. Otherwise it will
    return nil.
*/
// 代表验证失败的响应

@property (nullable, readonly, copy) NSURLResponse *failureResponse;

/*!
    @abstract Get the error representing authentication failure.
    @discussion If there was a previous authentication failure, and
    this protocol uses errors to indicate authentication failure,
    then this method will return the error. Otherwise it will
    return nil.
*/
// 获取表示认证失败的错误。
// 如果以前的认证失败,并且此协议使用错误来指示认证失败,则此方法将返回错误。 否则它将返回nil。

@property (nullable, readonly, copy) NSError *error;

/*!
    @abstract Get the sender of this challenge
    @result The sender of the challenge
    @discussion The sender is the object you should reply to when done processing the challenge.
*/
// 获取该挑战的sender
// sender就是当你处理完挑战应该回复的对象。

@property (nullable, readonly, retain) id<NSURLAuthenticationChallengeSender> sender;

@end

2. NSURLAuthenticationChallengeSender协议

/*!  
    @protocol NSURLAuthenticationChallengeSender 
    @discussion This protocol represents the sender of an
    authentication challenge. It has methods to provide a credential,
    to continue without any credential, getting whatever failure
    result would happen in that case, cancel a challenge, perform the default
    action as defined by the system, or reject the currently supplied protection-space
    in the challenge.
*/
// 此协议代表身份验证质询的发起人。 它提供了一种方法来提供证书,
// 在没有任何证书的情况下继续获取在这种情况下会发生的任何失败结果,取消挑战,
// 执行系统定义的默认操作,或拒绝挑战中当前提供的保护空间。

@protocol NSURLAuthenticationChallengeSender <NSObject>

/*!
    @method useCredential:forAuthenticationChallenge:
*/
- (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

/*!
    @method continueWithoutCredentialForAuthenticationChallenge:
*/
- (void)continueWithoutCredentialForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

/*!
    @method cancelAuthenticationChallenge:
*/
- (void)cancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

@optional
/*!
 @method performDefaultHandlingForAuthenticationChallenge:
 */
- (void)performDefaultHandlingForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

/*!
 @method rejectProtectionSpaceAndContinueWithChallenge:
 */
- (void)rejectProtectionSpaceAndContinueWithChallenge:(NSURLAuthenticationChallenge *)challenge;

@end

后记

本篇主要讲述NSURLAuthenticationChallenge这个类的详细信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容