У меня проблема с обновлением токена AWS Cognito с использованием аутентификации на стороне сервера в Go. Я могу получить id_token
, access_token
и refresh_token
с помощью метода cognitoidentityprovider.AdminInitiateAuth
. Я создал клиента пользовательских пулов с секретами, поэтому я должен предоставить SECRET_HASH
в AuthParameters
.
Все это прекрасно работает при входе в систему, но тот же секретный хэш не работает при обновлении токенов. Я трижды проверил код и убедился, что секретные хэши, которые я отправляю, одинаковы при входе в систему и при обновлении токена (он должен быть одинаковым, поскольку он использует имя пользователя, clientID и clientSecret, которые не меняются).
API AWS возвращает следующую ошибку:
{
"error": "NotAuthorizedException: Unable to verify secret hash for client myClientIdHere\n\tstatus code: 400, request id: c186ecf2-57a7-11e8-a01e-f97ed64650c9"
}
Я проверил, что отслеживание устройства отключено, поскольку в документации упоминается, что это проблема при обновлении токенов на стороне сервера (примечание в разделе «Поток аутентификации администратора», https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-server-side-authentication-flow).
Мой код обновления:
AWSRefreshToken := aws.String(refreshToken)
secretHash := secretHash(email, auth.Config.ClientID, auth.Config.ClientSecret)
AWSUserPoolID := aws.String(auth.Config.UserPoolID)
input := cognitoidentityprovider.AdminInitiateAuthInput{
AuthFlow: aws.String("REFRESH_TOKEN_AUTH"),
AuthParameters: map[string]*string{
"REFRESH_TOKEN": AWSRefreshToken,
"SECRET_HASH": &secretHash,
},
ClientId: &auth.Config.ClientID,
UserPoolId: AWSUserPoolID,
}
output, err := auth.AWSCognitoIdentityProvider.AdminInitiateAuth(&input)
Секретный хеш-код (от https://stackoverflow.com/a/46163403/3515197):
func secretHash(username, clientID, clientSecret string) string {
mac := hmac.New(sha256.New, []byte(clientSecret))
mac.Write([]byte(username + clientID))
return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}
Я проверил другие вопросы о переполнении стека, но в них упоминается только проблема с отслеживанием устройства и что необходим секретный хеш. Что мне здесь не хватает?