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

如何在Amplify Flutter中获取并存储JWT Token

获取AWS Amplify Cognito已登录用户的JWT Access Token(Flutter Web)

要获取已登录用户的JWT Access Token,你需要通过Amplify.Auth.fetchAuthSession()方法从CognitoAuthSession中提取,下面是具体实现步骤:

  1. 添加获取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;
  }
}
  1. 在登录后调用该函数
    你可以在首页添加按钮触发获取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('退出登录'),
        ),
      ],
    ),
  ),
)
  1. 完整修改后的代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:33:20