You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中MSAL OAuth2.0登录成功但acquireToken回调不执行

SwiftUI集成MSAL登录后弹窗不关闭、回调不触发问题

我参考了Swift/SwiftUI集成MSAL的示例项目,遇到以下异常:Microsoft登录弹窗能正常弹出,登录操作也可完成,但弹窗不会自动关闭,且acquireToken的完成回调完全无法触发。

我尝试将代码修改为与正常工作的signInWithGoogle()函数结构一致,甚至完全照搬指南中的仓库代码,都没能解决问题。

正常工作的Google OAuth2.0代码

// MARK: Google OAuth2.0 which works perfectly
func signinWithGoogle() {
    let scenes = UIApplication.shared.connectedScenes
    let windowScene = scenes.first as? UIWindowScene
    let window = windowScene?.windows.first

    guard let presentingViewController = window!.rootViewController else {
        print("There is no root view controller!")
        return
    }

    GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: presentingViewController) { user, error in
        guard error == nil else { return }
        guard let user = user else { return }

        user.authentication.do { authentication, error in
            guard error == nil else { return }
            guard let authentication = authentication else { return }

            let idToken = authentication.idToken
            self.verifyEmail(idToken: idToken!)
        }
    }
}

存在问题的Microsoft MSAL代码

// MARK: Microsoft MSAL which doesn't work
func signInWithMicrosoft() {
    let scenes = UIApplication.shared.connectedScenes
    let windowScene = scenes.first as? UIWindowScene
    let window = windowScene?.windows.first

    guard let presentingViewController = window!.rootViewController else {
        print("There is no root view controller!")
        return
    }
    
    do {
        let authority = try MSALB2CAuthority(url: URL(string: "https://login.microsoftonline.com/TENANT_ID_HERE")!)
        let pcaConfig = MSALPublicClientApplicationConfig(clientId: "CLIENT_ID_HERE", redirectUri: "REDIRECT_URI_HERE", authority: authority)
        let application = try MSALPublicClientApplication(configuration: pcaConfig)
        let webViewParameters = MSALWebviewParameters(authPresentationViewController: presentingViewController)
        let interactiveParameters = MSALInteractiveTokenParameters(scopes: ["user.read"], webviewParameters: webViewParameters)
        interactiveParameters.promptType = MSALPromptType.selectAccount
        
        application.acquireToken(with: interactiveParameters) { (result, error) in
            print("DEBUG: THIS COMPLETION DOESN'T RUN WHEN SUCCESSFULLY LOGGED IN, BUT CLOSING THE MICROSOFT LOGIN DOES RUN THIS COMPLETION")
            
            guard let result = result else {
                print("error \(error?.localizedDescription)")
                return
            }
            
            if let account = result.account.username {
                print("logging \(account)")
                print("logging \(result.account.description)")
                UIApplication.shared.windows.first {
                    $0.isKeyWindow
                }!.rootViewController = UIHostingController(rootView: ContentView())
            }
        }
    } catch {
        print("\(#function) logging error \(error)")
    }
}

上述代码位于EmailVerificationViewModel中,在EmailVerificationView里通过@StateObject var emailVerificationVM = EmailVerificationViewModel()实例化,按钮调用代码如下:

Button {
    emailVerificationVM.signInWithMicrosoft()
} label: {
    Text("Login")
}

点击按钮能正常打开Microsoft Office登录界面,但完成认证后,application.acquireToken(with: interactiveParameters)的完成回调完全不执行;不过关闭Microsoft登录弹窗时,回调会携带错误信息执行。

测试演示:
MSAL登录异常演示

内容的提问来源于stack exchange,提问作者Khoi Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:00:37