flutter - 如何使用 session 的刷新 token 在 amazon-cognito-identity-dart-2 包 flutter 中获取新的 jwt 访问 token ?

标签 flutter amazon-cognito refresh-token

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

当为 session 生成刷新 token 时,如何使用此刷新 token 在到期前获取新的 jwt 访问 token ?

最佳答案

如果您的目标只是获取 jwt 访问 token ,则可以在启动 session 后完成,而无需使用刷新 token 。

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

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);

现在您有一个活跃的 Cognito session 。此 session 包含所有相关 token 。您可以通过以下方式获取 jwt 访问 token :

String jwtToken = cognitoUserSession.getAccessToken().getJwtToken();

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

cognitoUserSession.isValid()

如果 token 过期(通过检查耗时和 token 过期时间),则返回 false。即使这返回 false,我们也不需要明确地使用刷新 token 。我们只需要像这样更新我们的 session :

CognitoUserSession newSession = cognitoUser.getSession();

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

因此,您只需要在获取访问 token 之前检查 session 是否有效,如果 session 已过期,只需调用 getSession() 方法来更新它。完整的实现看起来像这样:

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();
  }
}

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

关于flutter - 如何使用 session 的刷新 token 在 amazon-cognito-identity-dart-2 包 flutter 中获取新的 jwt 访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60630992/

相关文章:

firebase - 如何在列表中添加新项目?

flutter - InkWell 在 Flutter 中的 GridTile 中的图像顶部产生波纹

flutter - 如何为容器使用两种不同的背景色

amazon-web-services - 在使用 Google 进行 aws-amplify 联合登录后检索用户名和电子邮件

oauth - 如何从 Aqueduct 服务器获取刷新 token

dart - 在 StreamBuilder 中使用 SnackBar 的奇特方式是什么?

amazon-web-services - AWS Cognito - 通过 Cognito API 使用和更新用户配置文件或同步到单独的数据库

amazon-web-services - API 网关授权方接受 ID_token 但不接受 Access_Token

asp.net-core - 在 ASP.NET Core 中处理过期的刷新 token

ios - 莫亚 rxswift : Refresh token and restart request