如何在Amplify Flutter中获取并存储JWT Token
获取AWS Amplify Cognito已登录用户的JWT Access Token(Flutter Web)
要获取已登录用户的JWT Access Token,你需要通过Amplify.Auth.fetchAuthSession()方法从CognitoAuthSession中提取,下面是具体实现步骤:
- 添加获取Token的函数
在你的_MyAppState类中新增异步函数,用于获取当前用户的Access Token:
Future<String?> getCurrentAccessToken() async { try { final authSession = await Amplify.Auth.fetchAuthSession( options: CognitoSessionOptions(getAWSCredentials: false), ) as CognitoAuthSession; // 检查session是否有效 if (authSession.isSignedIn) { final accessToken = authSession.userPoolTokens?.accessToken; return accessToken?.jwtToken; } safePrint("用户未登录"); return null; } on Exception catch (e) { safePrint("获取Token失败: $e"); return null; } }
- 在登录后调用该函数
你可以在首页添加按钮触发获取Token的操作,或者在页面初始化时调用(需确保用户已登录)。修改build方法中的Scaffold部分:
home: Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('You are logged in!'), const SizedBox(height: 20), ElevatedButton( onPressed: () async { final token = await getCurrentAccessToken(); safePrint("当前Access Token: $token"); }, child: const Text('获取Access Token'), ), const SizedBox(height: 10), ElevatedButton( onPressed: signOutCurrentUser, child: const Text('退出登录'), ), ], ), ), )
- 完整修改后的代码
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart'; import 'package:amplify_authenticator/amplify_authenticator.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; import 'package:flutter/material.dart'; import 'amplifyconfiguration.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); _configureAmplify(); } void _configureAmplify() async { try { await Amplify.addPlugin(AmplifyAuthCognito()); await Amplify.configure(amplifyconfig); safePrint('Successfully configured'); } on Exception catch (e) { safePrint('Error configuring Amplify: $e'); } } Future<void> signOutCurrentUser() async { final result = await Amplify.Auth.signOut(); if (result is CognitoCompleteSignOut) { print('Sign out completed successfully'); } else if (result is CognitoFailedSignOut) { print('Error signing user out: ${result.exception.message}'); } } Future<String?> getCurrentAccessToken() async { try { final authSession = await Amplify.Auth.fetchAuthSession( options: CognitoSessionOptions(getAWSCredentials: false), ) as CognitoAuthSession; if (authSession.isSignedIn) { final accessToken = authSession.userPoolTokens?.accessToken; return accessToken?.jwtToken; } safePrint("用户未登录"); return null; } on Exception catch (e) { safePrint("获取Token失败: $e"); return null; } } @override Widget build(BuildContext context) { return Authenticator( initialStep: AuthenticatorStep.signIn, child: MaterialApp( builder: Authenticator.builder(), home: Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('You are logged in!'), const SizedBox(height: 20), ElevatedButton( onPressed: () async { final token = await getCurrentAccessToken(); safePrint("当前Access Token: $token"); }, child: const Text('获取Access Token'), ), const SizedBox(height: 10), ElevatedButton( onPressed: signOutCurrentUser, child: const Text('退出登录'), ), ], ), ), ), ), ); } }
注意事项:
- 确保用户已完成登录操作,未登录时调用
getCurrentAccessToken会返回null并打印提示 - 如果需要强制刷新Token,可以在
fetchAuthSession中添加forceRefresh: true参数 - 确认你的
amplifyconfiguration.dart中Cognito用户池和客户端ID配置正确
内容的提问来源于stack exchange,提问作者coder107
相关产品推荐
相关产品推荐

