首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用会话的刷新令牌在amazon-cognito identity-dart-2 package flutter中获取新的jwt访问令牌?

如何使用会话的刷新令牌在amazon-cognito identity-dart-2 package flutter中获取新的jwt访问令牌?
EN

Stack Overflow用户
提问于 2020-03-11 15:20:26
回答 2查看 1.3K关注 0票数 0

我目前正在使用Dart SDK amazon-cognito-identity-dart-2在flutter中进行身份验证和数据上传。

当为会话生成刷新令牌时,如何使用该刷新令牌在到期前获取新的jwt访问令牌?

EN

回答 2

Stack Overflow用户

发布于 2020-07-29 18:07:53

您必须使用用户身份验证详细信息和会话,并在用户登录时使用它。中提供了刷新令牌功能

代码语言:javascript
复制
 CognitoUserSession session;
 awsToken(Store<AppState> store) async {
final userPool = CognitoUserPool(Aws.userPoolId, Aws.clientId);
cognitoUser = CognitoUser('+91801*******', userPool);
final authDetails =
    AuthenticationDetails(username: '+91801*******', password: '12345678');
authDetails.authParameters = [];

try {
  session = await cognitoUser.authenticateUser(authDetails);
  print("refreshed_token--" + session.getRefreshToken().getToken());
} on CognitoUserCustomChallengeException catch (e) {
  // handle CUSTOM_CHALLENGE challenge
  print(e);
} catch (e) {
  print(e);
}
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-01 09:18:40

如果您的目标只是获取jwt访问令牌,则可以在启动会话后完成,而不必使用刷新令牌。

首先,需要对用户进行身份验证:

代码语言:javascript
复制
final userPool = CognitoUserPool(awsUserPoolId, awsClientId);
final cognitoUser = CognitoUser(email, userPool);
final authDetails = AuthenticationDetails(
      username: email, //user email
      password: password, //user password
);

CognitoUserSession cognitoUserSession = await cognitoUser.authenticateUser(authDetails);

现在你有了一个积极的认知会话。此会话包含所有相关令牌。您可以按如下方式获取jwt访问令牌:

代码语言:javascript
复制
String jwtToken = cognitoUserSession.getAccessToken().getJwtToken();

您可能会注意到,这并不涉及刷新令牌的使用,您可能想知道如何处理令牌可能过期的情况。幸运的是,这很简单。我们可以通过检查来确定令牌是否过期

代码语言:javascript
复制
cognitoUserSession.isValid()

如果令牌已过期(通过检查已用时间和令牌过期时间),则返回false。即使返回false,我们也不需要明确地使用刷新标记。我们只需要像这样更新我们的会话:

代码语言:javascript
复制
CognitoUserSession newSession = cognitoUser.getSession();

在这里,cognitoUser是我们在一开始验证的同一个用户变量。当调用getSession()方法时,如果当前令牌过期,我们的user对象将返回一个带有新令牌的新会话(这是使用refresh token在cognito类中完成的)。

因此,您需要做的就是在获取访问令牌之前检查会话是否有效,如果会话过期,只需调用getSession()方法进行续订。完整的实现如下所示:

代码语言:javascript
复制
class UserService {

  final _userPool = new CognitoUserPool(
    awsUserPoolId,
    awsClientId,
  );
  CognitoUser _user;
  CognitoUserSession _session;

  Future<bool> login(String email, String password) async {
    _user = CognitoUser(email, userPool);
    final authDetails = AuthenticationDetails(
        username: email, 
        password: password, 
    );
    try {
      _session = await cognitoUser.authenticateUser(authDetails);
    } on CognitoClientException catch (e) {
      return false;
    }
    return true; 
  }

  Future<String> getAccessToken() async {
    if (!_session.isValid()) {
      _session = await _user.getSession();
    }
    return _session.getAccessToken().getJwtToken();
  }
}

免责声明:为了简单起见,我从login方法返回了一个布尔值。您可能希望在处理异常方面做得更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60630992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档