我有一个 lambda,它接受用户名和密码并返回 JWT。代码(如下所示)基本上使用 cognito adminInitiateAuth() 来使用用户名和密码来获取 JWT。
let USER_POOL_CLIENT_ID = "6adc4ziG7GCzYmMwhWWVnJySbP";
let USER_POOL_ID = "us-east-1_upxvqiJUP";
AWS.config.update({region: 'us-east-1'});
const cognito = new AWS.CognitoIdentityServiceProvider();
let params = {
AuthFlow: "ADMIN_NO_SRP_AUTH",
ClientId: USER_POOL_CLIENT_ID,
UserPoolId: USER_POOL_ID,
AuthParameters: {
USERNAME: event.username,
PASSWORD: event.password
}
};
//console.log(`${JSON.stringify(params)}`);
const jwtContainer = await cognito.adminInitiateAuth(params).promise();
console.log(`jwtContainer = ${JSON.stringify(jwtContainer)}`);
这似乎有效,事实上,确实返回了一个有效的 JWT,其中包含由 jwt.io 解码的 child 。每当我尝试在受 JWT 保护的不同端点上使用 JWT(如下所示)时,我都会收到错误:
curl -v https://myapi.execute-api.us-east-1.amazonaws.com/reset-service-auth-password \
-H 'Accept-Language: en-US,en;q=0.9' \
-X POST \
-d '{"password": "xyz123","confirmPassword": "22221"}' \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Origin: http://localhost:8080" \
-H 'Authorization: Bearer jwtdataxxxxxxxxxxxxxxxx'
但是当我执行上面的代码时,我收到此错误:
www-authenticate:承载范围 =“aws.cognito.signin.user.admin”错误 =“invalid_token”error_description =“无法在 JWKS 中找到适当的 key 。确保在中提供“ child ” JWT,并且您的 JWKS 有可用于此 ID 的受支持证书”
我检查了我的 JWKS,JWT 中的 child 实际上在 JWKS 中。我不知道下一步该做什么或者到底出了什么问题。
我的授权者期望范围为 aws.cognito.signin.user.admin,而我的客户端不需要 key 。请询问您可能需要帮助我解决此问题的任何说明。
最佳答案
我今天也遇到了同样的问题。我希望你从那时起就明白了,但是,以防万一,也为了其他人......
我遵循了与您相同的调查步骤。我确信 AWS 出了问题。没有。
就我而言, token 是针对我们的生产池生成的,但配置中的开发端点泄漏,并且我们尝试在错误的端点上进行身份验证。
所以我的猜测是您遇到了类似的情况:重新检查您的 URL,您的池 ID 和您请求的 API 之间可能不匹配。
关于authentication - Cognito 服务身份验证返回有效的 JWT,但后续 JWT 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72387286/