【问题标题】:where can I find the secret key for the JWT from cognito我在哪里可以从 cognito 找到 JWT 的密钥
【发布时间】:2016-11-02 08:14:35
【问题描述】:

我正在为我的 Web 应用程序尝试 Cognito 用户池的登录功能。我能够获得令牌,但我不确定在哪里可以找到解码它的秘密。我在其中一篇文章中读到秘密是用户池中应用程序的秘密 ID。但是,对于 Javascript SDK,秘密 ID 是空白的。这是否意味着我的秘密也应该是空白的?我试过了,但我收到一条消息,上面写着“错误:PEM_read_bio_PUBKEY 失败”。

【问题讨论】:

  • 密钥作为 json 密钥提供,您可以从用户池下载。然后,您需要将其转换为 PEM 密钥才能使用它来解码 JWT。

标签: amazon-web-services amazon-cognito aws-cognito


【解决方案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(在“理解代码”部分)。

【讨论】:

  • 抱歉,这是完全错误的 - RS256 是一种非对称算法,需要公钥和私钥。正确的是,为了验证 JWT,您不需要用于签名的私钥。
  • 同意 B M 的评论。
  • 我回答的问题是“在哪里可以找到解码它的秘密”(而不是关于 RS256 的一般功能),所以我认为我的回答是正确的。
  • 您的回答极具误导性
【解决方案2】:

纠正另一个答案:RS256 是一种非对称算法,需要公钥和私钥。另见RS256 vs HS256: What's the difference?https://en.wikipedia.org/wiki/RSA_(cryptosystem)

正确的是,为了验证 JWT,您不需要用于签名的私钥,只需要 AWS 在https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json 下提供的公钥。

【讨论】:

  • 我从那里得到了一个 Json 数组,哪个属性包含令牌的公钥?尝试使用“n”属性中的值抛出签名无效
  • @JefreeSujit JWT 将包含一个“kid”(密钥 ID),它根据上面显示的 cognito-idp 请求决定要使用的 JWK。然后,您需要将 JWK 的 n(模数)和 e(公共指数)转换为“pem”格式的 RSA 公钥。这是用于转换的 scala 中的单行代码(使用 java 库)(ne 是字符串):Base64.getEncoder.encodeToString(KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger(1, Base64.getUrlDecoder.decode(n)), new BigInteger(1, Base64.getUrlDecoder.decode(e)))).getEncoded)
【解决方案3】:

只想用代码的sn-p总结一下这个话题:

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))
  ;
}

【讨论】:

  • 很好的总结。但是我们必须使用kid从keys数组中找到匹配的key。然后传递给 jwkTOPem()
  • 随意改进这个功能;)
猜你喜欢
  • 2021-03-21
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2020-05-23
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多