如何使用 AWS Cognito Ruby SDK 注册新用户?

ipe*_*sus 4 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",
    },
  ]
})
Run Code Online (Sandbox Code Playgroud)

输出

Aws::CognitoIdentityProvider::Errors::NotAuthorizedException (Unable to verify secret hash for client 4d2c7274mc1bk4e9fr*****)
Run Code Online (Sandbox Code Playgroud)

参考

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

rml*_*erd 5

如果您的应用程序客户端配置了客户端密钥,则大多数客户端请求都要求您在请求的选项参数中包含“秘密哈希”。Cognito 文档这样描述了秘密哈希:

SecretHash 值是使用用户池客户端的密钥和用户名加上消息中的客户端 ID 计算得出的 Base 64 编码的密钥哈希消息身份验证代码 (HMAC)。以下伪代码显示了如何计算该值。

Base64 ( HMAC_SHA256 ( "客户端密钥", "用户名" + "客户端 ID" ) )

该文档还通过一组 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' }]
       })
Run Code Online (Sandbox Code Playgroud)

CLIENT_SECRET是应用程序客户端密钥,可在General Settings > App Clients下找到。

结果:

#<struct Aws::CognitoIdentityProvider::Types::SignUpResponse
 user_confirmed=false,
 code_delivery_details=nil,
 user_sub="c87c2ac8-1480-4d15-a28d-6998d9260e73">
Run Code Online (Sandbox Code Playgroud)