Amplify Flutter 如何实现自动登录并获取authToken
Flutter 集成Amplify实现认证能力的实操方案
1. 应用重启后持久保持登录态(自动登录)
Amplify官方的amplify_auth_cognito插件默认会将用户的合法登录会话加密存储在系统级安全存储区(iOS的Keychain、Android的EncryptedSharedPreferences),无需手动编写持久化逻辑,满足“用户不主动登出则持续保持登录态”的需求。
实操注意事项:
- 初始化Auth插件时使用默认配置即可,无需额外传入持久化相关参数,标准初始化代码如下:
// 应用初始化阶段的Amplify配置 await Amplify.addPlugin(AmplifyAuthCognito()); await Amplify.configure(amplifyconfig); - 应用启动路由判断时,主动调用
fetchAuthSession方法校验本地会话有效性:如果本地存储的访问令牌过期,插件会自动用本地留存的刷新令牌完成静默续期,整个过程无界面交互,用户无感知。校验逻辑示例:// 应用启动阶段的登录态判断 try { final authSession = await Amplify.Auth.fetchAuthSession(); if (authSession.isSignedIn) { // 路由跳转至应用主界面 } else { // 路由跳转至登录界面 } } on AuthException { // 本地无有效登录态,跳转登录界面 } - 只有主动调用
Amplify.Auth.signOut()方法时,插件才会清空本地存储的所有用户凭据,完成登出流程。日常开发中不要手动清除应用本地的安全存储数据,否则会连带清掉Amplify留存的登录凭据,导致自动登录失效。 - 该持久化逻辑的有效覆盖范围是:应用被系统后台杀死、应用重启、应用版本更新;如果应用被用户手动卸载、被系统清理应用全部数据,属于系统层面的存储清除,不在自动登录的覆盖范围内。
2. 自定义API请求的authToken获取
所有需要附加身份凭证的出站请求,直接通过fetchAuthSession接口获取实时有效的令牌即可,无需手动管理令牌的过期、刷新逻辑。
实操步骤:
- 令牌获取逻辑示例:
// 通用token获取方法 Future<String?> getAuthToken() async { try { final cognitoSession = await Amplify.Auth.fetchAuthSession() as CognitoAuthSession; // 提取可直接用于请求头的idToken return cognitoSession.userPoolTokensResult.value.idToken.raw; } on AuthException { // 无有效登录态,触发重新登录流程 return null; } } - 令牌使用规则:将获取到的idToken以
Bearer <token值>的格式放入请求的Authorization请求头中,即可被后端的Cognito授权器正常识别。 - 效率优化技巧:
- 如果使用Amplify自带的
amplify_api插件发请求,完全不需要手动提取令牌——插件会自动为所有出站请求附加有效的authToken,无额外开发成本。 - 如果使用
dio、http等第三方网络库发自定义请求,可以在网络拦截器中统一调用上述getAuthToken方法,为所有请求自动填充认证头,无需在单个请求中重复编写令牌获取逻辑。
- 如果使用Amplify自带的
- 注意事项:不要将获取到的令牌手动缓存到应用的普通存储中,每次发请求前实时调用接口获取即可——插件内置的刷新逻辑会自动处理过期续期,手动缓存很容易因令牌过期导致请求401错误。
内容的提问来源于stack exchange,提问作者Camron
相关产品推荐
相关产品推荐

