好文章收藏夹

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

2018-03-16  本文已影响12人  刀客传奇

版本记录

版本号 时间
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这个类的详细信息。

上一篇下一篇

猜你喜欢

热点阅读