我正在为我的 Web 应用程序尝试 Cognito 用户池的登录功能。我能够获得令牌,但我不确定在哪里可以找到解码它的秘密。我在其中一篇文章中读到秘密是用户池中应用程序的秘密 ID。但是,对于 Javascript SDK,秘密 ID 是空白的。这是否意味着我的秘密也应该是空白的?我试过这个,但我收到一条消息,上面写着“错误:PEM_read_bio_PUBKEY 失败”。
3 回答
更正另一个答案:RS256 是一种非对称算法,需要公钥和私钥。另请参阅RS256 与 HS256:有什么区别?和https://en.wikipedia.org/wiki/RSA_(cryptosystem)。
正确的是,为了验证 JWT,您不需要用于对其进行签名的私钥,只需要 AWS 在https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
.
只想用这段代码总结一下这个话题:
const jwkToPem = require('jwk-to-pem');
const requestify = require('requestify');
/**
* Get cognito's secret key
* @param {String} region
* @param {String} userPoolId
* @returns {Promise}
*/
function getPem(region, userPoolId) {
const jwkUrl = `https://cognito-idp.${region}.amazonaws.com/${userPoolId}/.well-known/jwks.json`;
return requestify.request(jwkUrl, { method: 'get', dataType: 'json'})
.then(res => res.getBody()['keys'].shift())
.then(jwk => jwkToPem(jwk))
;
}
AWS 使用 RS256 算法,不需要密钥而是需要公钥来解码。
在这里您可以找到您的池的 JWKS:(https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
请参阅http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html#amazon -cognito-identity-user-pools-using-id-and-access-tokens-in-web-api )
这里描述了将 JWK 转换为公钥的过程:https ://mobile.awsblog.com/post/Tx3JK25U7Z9EUIU/Integrating-Amazon-Cognito-User-Pools-with-API-Gateway (在“理解代码”部分下) )。