我目前正在使用Dart SDK amazon-cognito-identity-dart-2在flutter中进行身份验证和数据上传。
当为会话生成刷新令牌时,如何使用该刷新令牌在到期前获取新的jwt访问令牌?
发布于 2020-07-29 18:07:53
您必须使用用户身份验证详细信息和会话,并在用户登录时使用它。中提供了刷新令牌功能
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);
}
}发布于 2021-01-01 09:18:40
如果您的目标只是获取jwt访问令牌,则可以在启动会话后完成,而不必使用刷新令牌。
首先,需要对用户进行身份验证:
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访问令牌:
String jwtToken = cognitoUserSession.getAccessToken().getJwtToken();您可能会注意到,这并不涉及刷新令牌的使用,您可能想知道如何处理令牌可能过期的情况。幸运的是,这很简单。我们可以通过检查来确定令牌是否过期
cognitoUserSession.isValid()如果令牌已过期(通过检查已用时间和令牌过期时间),则返回false。即使返回false,我们也不需要明确地使用刷新标记。我们只需要像这样更新我们的会话:
CognitoUserSession newSession = cognitoUser.getSession();在这里,cognitoUser是我们在一开始验证的同一个用户变量。当调用getSession()方法时,如果当前令牌过期,我们的user对象将返回一个带有新令牌的新会话(这是使用refresh token在cognito类中完成的)。
因此,您需要做的就是在获取访问令牌之前检查会话是否有效,如果会话过期,只需调用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();
}
}免责声明:为了简单起见,我从login方法返回了一个布尔值。您可能希望在处理异常方面做得更好。
https://stackoverflow.com/questions/60630992
复制相似问题