我问这个问题是因为我很惊讶我从谷歌搜索中找到的信息如此之少。然而,我能够找到我认为的根本原因。我会将其作为答案分享,看看是否有人能够详细说明或提供更好的解释。 因此,澄清一下,我正在使用适用于 Cognito 的 AWS JavaScript SDK。当我尝试一些标准用例时,我收到以下错误:
客户端配置了机密,但未收到机密
我可以采取什么步骤来解决这个问题?
以下示例展示了如何使用具有客户端 ID 和客户端密钥的客户端使用 Python 登录用户:
import json
import requests
import hmac
import hashlib
import base64
client_id = ""
client_secret = ""
cognito_url = ""
username = ""
password = ""
secret_hash = base64.b64encode(hmac.new(bytes(client_secret, 'utf-8'), bytes(
username + client_id, 'utf-8'), digestmod=hashlib.sha256).digest()).decode()
reqData = {
"AuthParameters": {
"USERNAME": username,
"PASSWORD": password,
"SECRET_HASH": secret_hash
},
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": client_id
}
headers = {
"X-Amz-Target": 'AWSCognitoIdentityProviderService.InitiateAuth',
"Content-Type": 'application/x-amz-json-1.1'
}
jsonResponse = requests.post(
url=cognito_url, data=json.dumps(reqData), headers=headers).json()
print(jsonResponse)
正确地指出 Cognito 的 Javascript SDK 不支持具有客户端密钥的应用程序。我遇到了同样的问题,但对于那些对此感兴趣的人来说,原因是...... 在AWS Cognito的上下文中,“客户端密钥”通常用于服务器端身份验证,以证明发出请求的客户端的身份。它被视为敏感信息,应予以保密。
对于客户端应用程序,尤其是那些在使用 JavaScript 的 Web 浏览器中运行的应用程序,通常不建议直接在应用程序中使用客户端密钥。 JavaScript 代码本质上对用户是可见的,并且在客户端代码中嵌入客户端机密可能会将其暴露给任何碰巧正在查看的人。
Cognito 的 JavaScript SDK 允许在客户端处理身份验证,而无需客户端密钥。相反,身份验证通常基于令牌,例如 ID 令牌和访问令牌,这些令牌是在身份验证过程中安全获取的。