使用Amplify Flutter在OAuth2登录后持久化会话与令牌
在Amplify Flutter中集成自定义OAuth2获取的Cognito令牌
1. 确认Amplify Auth基础配置
首先确保你已完成Amplify Auth的初始化,配置好对应的Cognito用户池和客户端信息。可以通过代码初始化:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; Future<void> initAmplify() async { final authPlugin = AmplifyAuthCognito(); await Amplify.addPlugin(authPlugin); await Amplify.configure(amplifyconfig); }
2. 解析令牌提取用户信息
从获取到的id_token中解析出用户名(或sub字段),后续创建用户实例需要该信息。可以用jwt_decode包解析JWT:
import 'package:jwt_decode/jwt_decode.dart'; // 从id_token中提取用户名 final Map<String, dynamic> tokenPayload = Jwt.parseJwt(idToken); final String username = tokenPayload['cognito:username'] ?? tokenPayload['sub'];
注意:需在pubspec.yaml中添加jwt_decode依赖。
3. 手动创建并持久化Cognito会话
使用已获取的令牌创建会话实例,通过Cognito用户对象保存会话,Amplify会自动负责会话的持久化:
import 'package:amplify_auth_cognito/src/sdk/cognito.dart'; // 初始化Cognito用户池 final userPool = CognitoUserPool( '<你的用户池ID>', '<你的客户端ID>', ); // 创建Cognito用户实例 final cognitoUser = CognitoUser(username, userPool); // 构造会话对象 final authSession = CognitoAuthSession( idToken: CognitoIdToken(idToken), accessToken: CognitoAccessToken(accessToken), refreshToken: CognitoRefreshToken(refreshToken), ); // 保存会话到Amplify await cognitoUser.setSession(authSession);
4. 验证会话持久化与令牌获取
应用重启后,可通过以下方法获取当前用户和会话令牌:
获取当前登录用户
final currentUser = await Amplify.Auth.getCurrentUser(); print('当前用户:${currentUser.username}');
获取会话令牌
final session = await Amplify.Auth.fetchAuthSession(); if (session.isSignedIn) { final cognitoSession = session as CognitoAuthSession; print('ID Token:${cognitoSession.idToken?.raw}'); print('Access Token:${cognitoSession.accessToken?.raw}'); }
5. 令牌刷新处理
Amplify会自动处理access_token过期后的刷新逻辑,若需手动触发刷新:
final refreshedSession = await Amplify.Auth.fetchAuthSession( options: const FetchAuthSessionOptions(forceRefresh: true), );
注意事项
- 确保Cognito客户端配置允许
authorization_code授权类型,且调用tokenAPI时的redirect_uri与OAuth2授权流程中的一致。 - 若解析
id_token失败,检查令牌是否为有效JWT格式,确保未被篡改或过期。
内容的提问来源于stack exchange,提问作者Darshan Prajapati
相关产品推荐
相关产品推荐

