Как зарегистрировать нового пользователя с помощью AWS Cognito Ruby SDK?

#ruby #amazon-web-services #amazon-cognito

#ruby #amazon-web-services #amazon-cognito

Вопрос:

Я хотел бы знать, как зарегистрировать нового пользователя с помощью AWS Cognito Ruby SDK.

До сих пор я пытался:

Ввод

 AWS_KEY = "MY_AWS_KEY"
AWS_SECRET = "MY_AWS_SECRET"

client = Aws::CognitoIdentityProvider::Client.new(
  access_key_id: AWS_KEY,
  secret_access_key: AWS_SECRET,
  region: 'us-east-1',
)

resp = client.sign_up({
  client_id: "4d2c7274mc1bk4e9fr******", # required
  username: "test@test.com", # required
  password: "Password23sing", # required
  user_attributes: [
    {
      name: "app", # required
      value: "my app name",
    },
  ],
  validation_data: [
    {
      name: "username", # required
      value: "true",
    },
  ]
})
  

Вывод

 Aws::CognitoIdentityProvider::Errors::NotAuthorizedException (Unable to verify secret hash for client 4d2c7274mc1bk4e9fr*****)
  

Ссылки

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CognitoIdentityProvider/Client.html#sign_up-instance_method

Комментарии:

1. Спасибо @rmlockerd однако существует много способов настройки учетных данных. Я использовал документацию по адресу: docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/… Экземпляр клиента, похоже, в порядке.

Ответ №1:

Если клиент вашего приложения настроен с секретом клиента, большинство клиентских запросов требуют, чтобы вы включили «секретный хэш» в параметры запроса. Документы Cognito описывают секретный хэш следующим образом:

Значение secretthash представляет собой базовый 64-кодированный код аутентификации сообщения с ключевым хэшем (HMAC), вычисляемый с использованием секретного ключа клиента пула пользователей и имени пользователя плюс идентификатор клиента в сообщении. Следующий псевдокод показывает, как вычисляется это значение.

Base64 ( HMAC_SHA256 ( «Секретный ключ клиента», «Имя пользователя» «Идентификатор клиента» ) )

В документах также ясно указано с помощью большого примера Java, что вы должны создать свой собственный. После небольшого эксперимента я смог успешно завершить sign_up вызов со следующим (мой тестовый пул был настроен так, чтобы требовать атрибуты электронной почты и имени):

 def secret_hash(client_secret, username, client_id)
  Base64.strict_encode64(OpenSSL::HMAC.digest('sha256', CLIENT_SECRET, username   CLIENT_ID))
end

client = Aws::CognitoIdentityProvider::Client.new(
  access_key_id: AWS_KEY,
  secret_access_key: AWS_SECRET,
  region: REGION)

username = 'bob.scum@example.com'
resp = client.sign_up({
         client_id: CLIENT_ID,
         username: username,
         password: 'Password23sing!',
         secret_hash: secret_hash(CLIENT_SECRET, username, CLIENT_ID),
         user_attributes: [{ name: 'email', value: username },
                           { name: 'name', value: 'Bob' }],
         validation_data: [{ name: 'username', value: 'true' },
                           { name: 'email', value: 'true' }]
       })
  

CLIENT_SECRET секретен ли клиент приложения, который можно найти в разделе Общие настройки> Клиенты приложений.

Результат:

 #<struct Aws::CognitoIdentityProvider::Types::SignUpResponse
 user_confirmed=false,
 code_delivery_details=nil,
 user_sub="c87c2ac8-1480-4d15-a28d-6998d9260e73">