我正在为我的Web App尝试Cognito用户池的登录功能。我能够获得令牌,但我不知道在哪里可以找到解密它的秘密。我在其中一篇文章中读到,秘密是用户池中应用程序的秘密ID。但是,对于Javascript SDK,密码ID为空。这是否意味着我的秘密也应该是空白的?我尝试了这个但是我收到一条消息“错误:PEM_read_bio_PUBKEY失败”。
答案 0 :(得分:11)
要纠正其他答案:RS256是一种非对称算法,需要公钥和私钥。另请参阅RS256 vs HS256: What's the difference?和https://en.wikipedia.org/wiki/RSA_(cryptosystem)。
正确的是,为了验证JWT,您不需要用于签名的私钥,只有AWS在sealed
下提供的公钥。
答案 1 :(得分:1)
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(在“理解代码”部分下)。
答案 2 :(得分:1)
只想用代码片段来总结这个主题:
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))
;
}
答案 3 :(得分:0)
我也试图解决所有这类问题。
为此,我提出了如何做这些对我有用的事情的例子
1)Verifying a JWT token with a 'secret' - aka Issuers RSA public key
2)Using an Issuers public SSL certificate to verify JWT tokens and other signatures