Токен обновления AWS Cognito не работает на секретном хеше - PullRequest
0 голосов
/ 14 мая 2018

У меня проблема с обновлением токена 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))
}

Я проверил другие вопросы о переполнении стека, но в них упоминается только проблема с отслеживанием устройства и что необходим секретный хеш. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 12 сентября 2018

Используйте идентификатор пользователя (sub) вместо электронной почты при генерации секретного хэша.

secretHash := secretHash(sub, auth.Config.ClientID, auth.Config.ClientSecret)
...