如果用户已经注销(他们的访问令牌已过期但他们的刷新令牌仍然有效),这也是可能的。
重要提示:仅当您有“您想记住用户的设备吗?”时,以下内容才有效。在 cognito 配置中设置为“否”。如果有人知道如何使用它,请告诉我。
我们使用以下流程(js 客户端应用程序连接到 .NET Core API):
- 用户使用用户名/密码 (
CognitoSignInManager<CognitoUser>.PasswordSignInAsync) 登录
- 客户端收到
token、userID和refreshToken并将它们存储在localStorage中。
- 当原始令牌过期(1 小时)时,客户端会从 API 收到 401 错误。
- 客户端使用
userID 和refreshToken 调用另一个API 端点,然后后者又在我们的用户服务上调用以下代码。
- 如果刷新结果成功,我们返回新的令牌(
AuthenticationResult.IdToken)。
- 客户端使用新令牌重复最初在 401 中出错的调用。
这是我们添加到用户服务中的代码:
public async Task<UserLoginResult> SignInRefreshAsync(string uid, string refreshToken)
{
try
{
var result = await _cognitoIdentityProvider.InitiateAuthAsync(
new InitiateAuthRequest
{
AuthFlow = AuthFlowType.REFRESH_TOKEN_AUTH,
ClientId = _pool.ClientID,
AuthParameters = new Dictionary<string, string>
{
{ "REFRESH_TOKEN", refreshToken },
{ "SECRET_HASH", HmacSHA256(uid + _pool.ClientID, _options.UserPoolClientSecret) }
}
});
if (!result.HttpStatusCode.Successful() || string.IsNullOrEmpty(result.AuthenticationResult?.IdToken))
return new UserLoginResult(UserLoginStatus.Failed);
return new UserLoginResult(UserLoginStatus.Success, uid, null, null, result.AuthenticationResult.IdToken, null);
}
catch
{
return new UserLoginResult(UserLoginStatus.Failed);
}
}
private static string HmacSHA256(string data, string key)
{
using (var sha = new System.Security.Cryptography.HMACSHA256(System.Text.Encoding.UTF8.GetBytes(key)))
{
var result = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(data));
return Convert.ToBase64String(result);
}
}
IAmazonCognitoIdentityProvider _cognitoIdentityProvider 由 DI 解析。
AWSCognitoClientOptions _options = configuration.GetAWSCognitoClientOptions(); 和 IConfiguration configuration 也是从 DI 解析的。
UserLoginResult 是我们持有令牌和刷新令牌的类。显然,相应地进行调整。
请注意,根据您的配置是 Cognito,可能不需要设置 SECRET_HASH。