AWS Amplify Auth登录会话应用重启后无法持久化的原因?
AWS Amplify登录会话无法在应用重启后持久化问题排查
我的Amplify配置代码
do { Amplify.Logging.logLevel = .verbose try Amplify.add(plugin: AWSCognitoAuthPlugin()) try Amplify.add(plugin: AWSS3StoragePlugin()) try Amplify.add(plugin: apiPlugin) try Amplify.configure() print("Initialized Amplify") } catch { print("Could not initialize Amplify: \(error)") }
登录状态检查代码
do { let session = try await Amplify.Auth.fetchAuthSession() switch session.isSignedIn { case true: DZLog("Signed in") case false: DZLog("Not signed in") } } catch { DZError("Error while fetching session", error: error) }
登录实现代码
do { let options = AuthWebUISignInRequest.Options(scopes: ["openid", "email", "profile", "aws.cognito.signin.user.admin"], pluginOptions: AuthWebUISignInRequest.Options.preferPrivateSession()) let signInResult = try await Amplify.Auth.signInWithWebUI(for: .apple, presentationAnchor: window, options: options) if signInResult.isSignedIn { print("Sign in succeeded") } } catch let error as AuthError { DZError("Error in signin", error:error) } catch { DZError("Error in signin", error:error) }
问题描述
应用重启后,调用Amplify.Auth.fetchAuthSession()始终返回未登录状态,登录会话无法在重启间保持持久化。
问题原因及解决方案
原因
你在登录时使用了AuthWebUISignInRequest.Options.preferPrivateSession()插件选项。该选项会让Web UI登录流程使用私有浏览器会话,而私有会话的设计逻辑就是不持久化存储用户凭证——会话结束(如关闭浏览器、重启应用)后,凭证会被自动清除,导致应用重启后无法恢复登录状态。
解决方案
移除preferPrivateSession()这个插件选项,修改后的登录代码如下:
do { let options = AuthWebUISignInRequest.Options(scopes: ["openid", "email", "profile", "aws.cognito.signin.user.admin"]) let signInResult = try await Amplify.Auth.signInWithWebUI(for: .apple, presentationAnchor: window, options: options) if signInResult.isSignedIn { print("Sign in succeeded") } } catch let error as AuthError { DZError("Error in signin", error:error) } catch { DZError("Error in signin", error:error) }
如果业务场景确实需要使用私有会话,无法依赖Amplify自动持久化登录状态,需手动实现凭证的存储与恢复逻辑,但这违背私有会话的设计初衷,不推荐该做法。
内容的提问来源于stack exchange,提问作者DanielZanchi
相关产品推荐
相关产品推荐

