0

我有一个基于 AppAuth-iOS 示例(https://github.com/openid/AppAuth-iOS)和 Okta OAuth 示例(https://github.com/oktadeveloper/okta-openidconnect )的简单 iOS Swift 应用程序-appauth-ios)。我没有使用服务发现,也没有使用自动令牌获取(即不使用 authStateByPresentingAuthorizationRequest)。

我的示例适用于 Azure AD,但不适用于 Okta。我能够登录并通过身份验证并重定向回我的移动应用程序 (AppDelegate.application()),但随后流程不会返回到我的 OIDAuthorizationService.present() 完成块。

这是一些代码:

@IBAction func signInButton(_ sender: Any) {

    // select idp
    switch selectedIdentityProvider! {
    case "Azure AD":
        selectedAuthConfig = AzureAdAuthConfig()
    case "Okta":
        selectedAuthConfig = OktaAuthConfig();
    default:
        return
    }

    appAuthAuthorize(authConfig: selectedAuthConfig!)
}

func appAuthAuthorize(authConfig: AuthConfig) {
    let serviceConfiguration = OIDServiceConfiguration(
        authorizationEndpoint: NSURL(string: authConfig.authEndPoint)! as URL,
        tokenEndpoint: NSURL(string: authConfig.tokenEndPoint)! as URL)

    let request = OIDAuthorizationRequest(configuration: serviceConfiguration, clientId: authConfig.clientId, scopes: authConfig.scope, redirectURL: NSURL(string: authConfig.redirectUri)! as URL, responseType: OIDResponseTypeCode, additionalParameters: nil)

    doAppAuthAuthorization(authRequest: request)
}


func doAppAuthAuthorization(authRequest: OIDAuthorizationRequest) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    appDelegate.currentAuthorizationFlow = OIDAuthorizationService.present(authRequest, presenting: self, callback: {
        (authorizationResponse, error) in
        if (authorizationResponse != nil) {
            self.authState = OIDAuthState(authorizationResponse: authorizationResponse!)
            self.logMessage(message: "Got authorization tokens. Access token: \(String(describing: self.authState?.lastAuthorizationResponse.authorizationCode))")
            self.doTokenRequest()
        } else {
            self.authState = nil
            self.logMessage(message: "Authorization error: \(String(describing: error?.localizedDescription))")
        }
    })
}

我可以重写代码以使用 authStateByPresentingAuthorizationRequest() 来查看它是否有效,但有点怀疑,因为此代码适用于 Azure AD。有什么建议么?

更新 1 我忘了提到我有一个工作的 Android/Java 示例,它与相同的 Okta 定义背道而驰,并且像魅力一样工作。

更新 2 我确实重写了代码以针对 Okta 使用authStateByPresentingAuthorizationRequest()并且得到了相同的结果(即在重定向回我的应用程序后卡住了)。我对 Azure AD 进行了测试,它工作正常。

4

1 回答 1

2

解决。我猜问题是 Okta 中定义的重定向 URL 是大小写混合的。Android AppAuth 实现不介意,但 iOS AppAuth 实现可以。将 Okta 中的重定向 URL 更改为仅小写,将传入的重定向 Uri 参数更改为仅小写和 bing,一切都很好。感谢@jmelberg 为我指明了这个方向——通过调试 resumeAuthorizationFlow(with: url) 我能够看到确切的行为以及调用返回 False 的原因。

于 2017-09-15T15:49:22.380 回答