在 iOS 应用程序中实现验证问题处理程序

improve this page | report issue

概述

在尝试访问受保护资源时,服务器(安全性检查)会向客户机发回一个列表,其中包含一个或多个验证问题,供客户机处理。
该列表会作为 JSON 对象接收,列出安全性检查名称以及其他数据的可选 JSON

{
  "challenges": {
    "SomeSecurityCheck1":null,
    "SomeSecurityCheck2":{
      "some property": "some value"
    }
  }
}

然后,客户机必须为每项安全性检查注册验证问题处理程序
验证问题处理程序可定义特定于安全性检查的客户机端行为。

创建验证问题处理程序

验证问题处理程序是可处理 MobileFirst Server 发送的验证问题的类,如显示登录屏幕、收集凭证和将其提交回安全性检查。

在此示例中,安全性检查为 PinCodeAttempts,在实现 CredentialsValidationSecurityCheck 中定义。此安全性检查发送的验证问题包含剩余登录尝试次数 (remainingAttempts) 以及可选 errorMsg

创建可扩展 SecurityCheckChallengeHandler 的 Swift 类:

class PinCodeChallengeHandler : SecurityCheckChallengeHandler {

}

处理验证问题

SecurityCheckChallengeHandler 协议的最低要求是实现 handleChallenge 方法,这会提示用户提供凭证。handleChallenge 方法会接收作为 Dictionary 的验证问题 JSON

在此示例中,警报会提示用户输入 PIN 码:

override func handleChallenge(challenge: [NSObject : AnyObject]!) {
    NSLog("%@",challenge)
    var errorMsg : String
    if challenge["errorMsg"] is NSNull {
        errorMsg = "This data requires a PIN code."
    }
    else{
        errorMsg = challenge["errorMsg"] as! String
    }
    let remainingAttempts = challenge["remainingAttempts"] as! Int

    showPopup(errorMsg,remainingAttempts: remainingAttempts)
}

样本应用程序中包含 showPopup 的实现。

如果凭证不正确,那么预计框架会再次调用 handleChallenge

提交验证问题的答案

在从 UI 收集凭证之后,使用 WLChallengeHandlersubmitChallengeAnswer(answer: [NSObject : AnyObject]!) 方法将答案发送回安全性检查。在此示例中,PinCodeAttempts 预期有一个名为 pin 且包含提交的 PIN 码的属性:

self.submitChallengeAnswer(["pin": pinTextField.text!])

取消验证问题

在某些情况下(如单击 UI 中的取消按钮),您想要通知框架完全丢弃此验证问题。

要实现此目标,请调用:

self.cancel()

处理故障

某些场景可能会触发故障(如达到最大尝试次数)。要处理这些场景,请实现 SecurityCheckChallengeHandlerhandleFailure 方法。作为参数传递的 Dictionary 的结构很大程度上取决于故障性质。

override func handleFailure(failure: [NSObject : AnyObject]!) {
    if let errorMsg = failure["failure"] as? String {
        showError(errorMsg)
    }
    else{
        showError("Unknown error")
    }
}

样本应用程序中包含 showError 的实现。

处理成功

通常,该框架会自动处理成功情况,以支持应用程序的其余部分继续运作。

您还可以通过实现 SecurityCheckChallengeHandlerhandleSuccess(success: [NSObject : AnyObject]!) 方法,选择在框架关闭验证问题处理程序流之前执行某些操作。同样,success Dictionary 的内容和结构取决于安全性检查发送的内容。

PinCodeAttemptsSwift 样本应用程序中,成功不包含任何其他数据,因此不会实现 handleSuccess

注册验证问题处理程序

为了使验证问题处理程序侦听正确的验证问题,您必须通知框架将验证问题处理程序与特定的安全性检查名称相关联。

为此,请使用安全性检查初始化验证问题处理程序,如下所述:

var someChallengeHandler = SomeChallengeHandler(securityCheck: "securityCheckName")

然后,您必须注册验证问题处理程序实例:

WLClient.sharedInstance().registerChallengeHandler(someChallengeHandler)

在此示例中,位于一行上:

WLClient.sharedInstance().registerChallengeHandler(PinCodeChallengeHandler(securityCheck: "PinCodeAttempts"))

注:在整个应用程序生命周期内,注册验证问题处理程序应当只进行一次。建议使用 iOS AppDelegate 类来执行此操作。

样本应用程序

样本 PinCodeSwift 是一款使用 WLResourceRequest 获取银行存款余额的 iOS Swift 应用程序。
该方法通过 PIN 码受到保护,最多有 3 次尝试机会。

单击以下载 SecurityAdapters Maven 项目。
单击以下载 iOS Swift 本机项目。

样本用法

请遵循样本的 README.md 文件获取指示信息。

样本应用程序

Last modified on February 23, 2017