我有一个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解码的子对象。每当我尝试在受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: Bearer scope="错误="invalid_token"error_description="无法在JWKS中找到合适的键。确保有一个"孩子"在JWT中提供,并且您的JWKS有一个受支持的证书可用于此id
我检查了我的JWKS, JWT中的孩子实际上在JWKS中。我不知道下一步该做什么,也不知道哪里出了问题。
我的授权器期望作用域为aw .cognito.sign .user.admin,而我的客户端不需要secret。如果你需要帮助我解决这个问题,请提出任何澄清。
我今天也遇到了同样的问题。我希望你从那时起就明白了,但为了以防万一,也为了其他人……
我遵循了你所做的相同的调查步骤。我确信AWS出了问题。没有。
在我的例子中,令牌是针对我们的生产池生成的,但是在配置中泄露了一个开发端点,并且我们试图在错误的端点上进行身份验证。
所以我猜你得到了类似的东西:重新检查你的url,你的池ID和你请求的API之间可能不匹配。