ios - 网关挑战处理程序 : handleChallenge() not being called after upgrading to MobileFirst v. 8.0

标签 ios swift ibm-mobilefirst

我们有一个生产 iOS 应用程序,目前在 MFP 7.0 下运行。我正在将其升级到 MFP 8.0。

在现有版本中,我们将ChallengeHander 扩展为ISAMChallengeHandler 来处理ISAM 网关登录请求。对于 v8.0,我更改了 ISAMChallengeHandler 以扩展 GatewayChallengeHandler。这涉及将 isCustomResponse() 更改为 canHandleResponse() 并删除对 submitFailure() 的调用。

新版本未按预期运行。当我使用 WLClient.getInstance().invokeProcedure(...) 调用适配器时,网关返回登录屏幕,ISAMChallengeHandler.canHandleResponse() 被正确调用并返回 true。但是 handleChallenge() 永远不会被调用。

相反,似乎再次尝试向适配器发出 HTTP 请求,从而导致对 canHandleResponse() 的另一次调用。这种情况连续发生 7 次,而没有任何尝试调用 handleChallenge()。然后发生来自 WLResourceRequest 的错误,WLDelegate 获得 onFailure() 回调。

是什么导致了这种行为?应用程序的逻辑与 7.0 版本相比没有变化。不再支持 invokeProcedure() 了吗?我在 wlConnectWithDelegate() 和 WLProcedureInvocationData() 上收到 Xcode 弃用警告,但在 invokeProcedure() 上没有收到(这没有意义)。

HTTP 重试总是发生七次。以下是应用程序的日志条目,显示了这一点。为了便于阅读,我删除了“响应内容”行。 LoginManager 是使用 LoginListener 作为 WLDelegate 调用 invokeProcedure() 的类。

2017-02-07 20:41:41.613 sitecompliance[50592:4035152] <AppDelegate> App starting: Optional("1.0") Optional("309.2")
2017-02-07 20:41:41.619 sitecompliance[50592:4035152] <AppDelegate> deviceDate (UTC): 2017-02-08 02:41:41 +0000
2017-02-07 20:41:41.620 sitecompliance[50592:4035152] <AppDelegate> deviceDate (localtime): Feb 7, 2017, 8:41:41 PM
2017-02-07 20:41:41.669 sitecompliance[50592:4035152] <LoginManager.connectAndLogin>
2017-02-07 20:41:42.386 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning FALSE
2017-02-07 20:41:43.595 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning FALSE
2017-02-07 20:41:43.595 sitecompliance[50592:4035152] <ConnectListener.onSuccess> connectionSuccess
2017-02-07 20:41:43.596 sitecompliance[50592:4035152] <LoginManager.connectionSuccess>
2017-02-07 20:41:43.599 sitecompliance[50592:4035152] <LoginManager.authenticate> Invoking Worker/getWorker
2017-02-07 20:41:44.469 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.470 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:44.584 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.585 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:44.682 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.682 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:44.782 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.782 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:44.878 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.878 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:44.973 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:44.974 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:45.075 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> Found "/pkmslogin.form"
2017-02-07 20:41:45.076 sitecompliance[50592:4035152] <ISAMChallengeHandler.canHandleResponse> returning TRUE
2017-02-07 20:41:45.076 sitecompliance[50592:4035152] [ERROR] [WORKLIGHT] -[WLResourceRequest requestFailed:error:] in WLResourceRequest.m:695 :: WL_OAUTH
2017-02-07 20:41:45.094 sitecompliance[50592:4035152] <LoginListener.onFailure> Cannot retrieve a valid authorization header for header. Check resource and authorization server configuration.
2017-02-07 20:41:45.095 sitecompliance[50592:4035152] <LoginViewController.loginFailure> System error.

这是 ISAMChallenger 处理程序的开头,显示了 canHandleResponse() 和 handleChallenge() 方法:

class ISAMChallengeHandler: GatewayChallengeHandler
{
    let baseURL: String!

    override init(){
        baseURL = "\(getBaseURL()!)"
        super.init(gatewayName: "HeaderAuthRealm")
    }

    override func canHandleResponse(response: WLResponse!) -> Bool
    {
        if response != nil {
            if response.responseText != nil {
                if response.responseText.rangeOfString("PKMS Administration: Expired Password") != nil {
                    MQALogger.log("<ISAMChallengeHandler.canHandleResponse> Found \"PKMS Administration: Expired Password\"")
                    MQALogger.log("<ISAMChallengeHandler.canHandleResponse> returning TRUE")
                    return true
                }
                if response.responseText.rangeOfString("/pkmslogin.form") != nil {
                    MQALogger.log("<ISAMChallengeHandler.canHandleResponse> Found \"/pkmslogin.form\"")
                    MQALogger.log("<ISAMChallengeHandler.canHandleResponse> returning TRUE")
                    return true
                }

            }
        }
        MQALogger.log("<ISAMChallengeHandler.canHandleResponse> returning FALSE")
        return false
    }

    override func handleChallenge(response: WLResponse!)
    {
        //HPDIA0200W Authentication failed. You have used an invalid user name, password or client certificate.
        let failedLogin = response.responseText.rangeOfString("HPDIA0200W") != nil
        let passwordExpired = response.responseText.rangeOfString("PKMS Administration: Expired Password") != nil
        let worker = Worker.getWorker()

        if worker.authDataSet && !failedLogin && !passwordExpired
        {
            MQALogger.log("<ISAMChallengeHandler.handleChallenge> Sending stored login data to ISAM")
            submitISAMAuthData()
        }
        else
        {
            MQALogger.log("<ISAMChallengeHandler.handleChallenge> A login screen form should appear")
            if failedLogin {
                needCredentials("Please check your credentials.")
            } else if passwordExpired {
                worker.password = nil
                saveObjects()
                notify("Password expired",
                    myMessage: "Change on ServiceArizona secure gateway, then sign into app again.", vc: nil)
                    { self.showLoginView() }
            } else {
                needCredentials(nil)
            }
        }
    }

最佳答案

设计在 8.0 中发生了变化,LTPA 是目前通过 ISAM 验证移动优先资源的方式。用于处理自定义挑战的类是 GatewayChallengeHandler(),它已在您的示例中正确使用。

捕获从网络发送的挑战的函数应该使用canHandle() 处理。我看到,在您的示例中,正在使用 canHandleResponse()。我想这可能是 handleChallenge() 没有在您的代码中被调用的原因。

请查看上面评论中附加的新链接以获取示例代码。

关于ios - 网关挑战处理程序 : handleChallenge() not being called after upgrading to MobileFirst v. 8.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42104043/

相关文章:

ios - 错误 : Use of self in property access 'reuseidentifier' before super. init 初始化自身

ios - IBM Worklight 6.1 - iOS 6.1 上的 App Center 错误

android - IBM Worklight - 如何使用自定义服务器 URL?

ios - 如何在 UICollectionView、Swift 5、Xcode 的行下添加行

swift - 将.xib文件内TableCellView中项目的outlet设置为自定义NSTableCellView子类

ios - “计数”不能用于类型 'ViewController'

ios - Swift 中的动态表 ImageView

基于 Java 的适配器 - 找不到返回值

ios - 如果 UITabBar 的项目超过 5 个,则操作不起作用

ios - NSTimer 取消我的 UIView.animateWithDuration