Jac*_*ope 5 amazon-web-services jwt aws-cognito
当我下载特定用户池的JWT集时,可从以下网址获得该资源:https:// cognito-idp。{region} .amazonaws.com / {userPoolId} /.well-known/jwks.json
JSON包含2个键。我为该池创建的所有用户似乎仅使用这些键之一。
每个用户池具有多个密钥的原因是什么?
根据文档:
Amazon Cognito 为每个用户池生成两对 RSA 加密密钥。其中一个私钥用于对令牌进行签名。
据推测这是出于安全原因。从有限的试错来看,一个用于加密id 令牌,另一个用于加密访问令牌。或者也许目的是支持密钥轮换(如@Michael-sqlbot 所建议)。
一旦您理解了原因(或不理解),问题就变成了如何处理这两个键。
再次参考文档,要验证 JWT 签名,您需要:
要确定使用哪个RSA 加密密钥来加密您的 JWT,需要执行步骤 1 和 2。
import jsonwebtoken from 'jsonwebtoken'
import jwkToPem from 'jwk-to-pem'
const jsonWebKeys = [ // from https://cognito-idp.us-west-2.amazonaws.com/<UserPoolId>/.well-known/jwks.json
{
"alg": "RS256",
"e": "AQAB",
"kid": "ABCDEFGHIJKLMNOPabc/1A2B3CZ5x6y7MA56Cy+6ubf=",
"kty": "RSA",
"n": "...",
"use": "sig"
},
{
"alg": "RS256",
"e": "AQAB",
"kid": "XYZAAAAAAAAAAAAAAA/1A2B3CZ5x6y7MA56Cy+6abc=",
"kty": "RSA",
"n": "...",
"use": "sig"
}
]
function validateToken(token) {
const header = decodeTokenHeader(token) // {"kid":"XYZAAAAAAAAAAAAAAA/1A2B3CZ5x6y7MA56Cy+6abc=", "alg": "RS256"}
const jsonWebKey = getJsonWebKeyWithKID(header.kid)
verifyJsonWebTokenSignature(token, jsonWebKey, function(err, decodedToken) {
if (err) {
console.error(err)
} else {
console.log(decodedToken)
}
})
}
function decodeTokenHeader(token) {
const [headerEncoded] = token.split('.')[0]
const buff = new Buffer(headerEncoded, 'base64')
const text = buff.toString('ascii')
return JSON.parse(text)
}
func getJsonWebKeyWithKID(kid) {
for (let jwk of jsonWebKeys) {
if (jwk.kid == kid) {
return jwk
}
}
return null
}
function verifyJsonWebTokenSignature(token, jsonWebKey, clbk) {
const pem = jwkToPem(jsonWebKey)
jsonwebtoken.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) {
return clbk(err, decodedToken)
})
}
validateToken('xxxxxxxxx.XXXXXXXX.xxxxxxxx')
Run Code Online (Sandbox Code Playgroud)
小智 -1
\n\n“首先,从以下网址获取 JSON Web 密钥集 (JWKS) 文件。将区域和 userPoolId 替换为您的 Cognito 用户池\xe2\x80\x99s 配置。
\n\nhttps://cognito-idp .{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
\n\n此 JSON 哈希是一组 JWK,因此称为 JWKS。它可能包含也可能不包含超过 1 个 JWK。如果有多个JWK,我们应该使用哪一个来进行解码?
\n\n在JWT中,令牌的标头部分有一个名为kid的键,它是JWT的第一个哈希值。而在每个 JWK 中,还有一把名为“kid”的钥匙。因此,我们应该使用 JWK 和匹配的 Kid 值来解码 JWT。”
\n| 归档时间: |
|
| 查看次数: |
845 次 |
| 最近记录: |