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登录弹窗时,回调会携带错误信息执行。
测试演示:
内容的提问来源于stack exchange,提问作者Khoi Nguyen
相关产品推荐
相关产品推荐

