Iho*_* M. 1 java authentication jwt jwk
我正在阅读这篇关于 JWT 的博客,以及如何使用它的签名部分来验证令牌实际上是由受信任方颁发的。
https://hackernoon.com/json-web-tokens-jwt-demystified-f7e202249640
JSON Web Key (JWK) 是一个 JSON 对象,它包含一个众所周知的公钥,可用于验证已签名 JWT 的签名。
如果您的 JWT 的颁发者使用非对称密钥来签署 JWT,它可能会托管一个名为 JSON Web 密钥集 (JWKS) 的文件。JWKS 是一个包含属性键的 JSON 对象,而该键又包含一组 JWK 对象。
这是我的代码库中为我生成 JWT 的 Java 代码片段:
new JwtBuilder().setClaims(claims).setExpiration(expiration).signWith(signatureAlgorithm, sharedSecret).compact();
Run Code Online (Sandbox Code Playgroud)
我不太明白我如何获得 JWK 以及如何使用它们进行签名?我还没有在网上找到任何例子。
任何帮助将不胜感激。
每个开放的 id 服务器都必须为租户提供一个端点,如下所示:
https://--YOUR DOMAIN----/.well-known/jwks.json
Run Code Online (Sandbox Code Playgroud)
如果您访问此端点,您将看到 json 格式
{
keys: [
{
alg: 'RS256',
kty: 'RSA',
use: 'sig',
n: 'tTMpnrc4dYlD8MtmPnW3xZNbLxkaGCUwTqeKB4dfLg11dEpMyQEc4JRxUvRzp9tz00r6lkZ1ixcvIiuB_eMVckU8VyFSFWBSAxp5duBk6lRpYk-QjK3kEdPxYLxyW84gNzwMi-XW8zxJbsOa-cRM9sCb62Qz2yfWoQfimoFXsCnVHq496kizO7gZ972JefvTce1_n9dd_1p0K6c14qcCXtF6hbA_gQ0N7h3IyloBqiusKyTsV-ZrMZDldZkI-4v7s49TdcRZgEOvSapMz5YyoDvAWzuWGEiljkjkCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5J',
e: 'AQAB',
kid: 'NTY2MjBCNzQ1RTLPQzk3NzczRRTMQ0E4NzE2MjcwOUFCRkUwRTUxNA',
x5t: 'NTY2MjBCNzQ1RTJPLzk3NzczRUNPO0E4NzE2MjcwOUFCRkUwRTUxNA',
x5c: [Array]
}
]
}
Run Code Online (Sandbox Code Playgroud)
什么是x5c?
“x5c”(X.509 证书链)头参数包含对应于用于对 JWS 进行数字签名的密钥的 X.509 公钥证书或证书链 [RFC5280]。证书或证书链表示为证书值字符串的 JSON 数组。数组中的每个字符串都是 base64 编码(不是 base64url 编码)的 DER [ITU.X690.2008] PKIX 证书值。包含与用于对 JWS 进行数字签名的密钥相对应的公钥的证书必须是第一个证书。这可以跟随着额外的证书,每个后续的证书都是用来证明前一个证书的。接收方必须根据 RFC 5280 [RFC5280] 验证证书链,如果发生任何验证失败,则认为该证书或证书链无效。此标题参数的使用是可选的。
如果您检查 x5c 数组,您会看到很长的字符串。您必须取这个值并将它们分开,每 64 个值。这很简单。这是一个例子:
-----BEGIN CERTIFICATE-----
MIIDBzCCAe+gAwIBAgIJY5XAn120Mst4MA0GCSqGSIb3DQEBCwUAMCExHzAdBgNV
BAMTFmRl2e11ZGlrdGt5Mi5hdXRoMC5jb20wHhcNMTkwOTI5MjAxNjE4WhcNMzMw
NjA3MjAxNjE4WjAhMR8wHQYDVQQDExZkZXYtdWe3a3RreTIuYXV0aDAuY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AeIIBCgKCAQEAtTMpnrc4dYlD8MmPnW3xZNbL
xkaGCUwTqeKB4etLg11dEpMyQEc4JRxUvRzp9t656lkZ1ixcvIiuB/eMVckU8VyF
SFWBSAxp5vrBk6lRpYk+QjK3kEdA9PxYLxyW84gNzwMi+XW8zxJbsOa+cRM9sCb6
2Qz2fWoQfimoFXsCnVHq496kp93izO7gZ972JefvTce1/n9dd/1p0K6c14qcCXtF
6hbA/gQ0N7h3IyloBqiusKyTsV+ZrMZDldZkI+4v7s49TdcRZgEOvSapMz5YyoDv
AWzuWGEilCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5JTz9LlKjYAqJ6ETGYKhjkwID
AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQme5xBKaloQKQr5oxt
7uRlWthe6jAOBgNVHQ8BAf8EBAMCAoQwDQYJKoZIhvcNAQELBQADopEBABpfpizn
MSJ67HDX358Rav5CYFEeIBeHXrxDQLprKdNzNSxOJ6tRpk6OF0Qs52wCEbrUXYBu
MRjmmmvN3bBHGMmq/g4VPZGDLh/JF5xJjRj13um8Rfua3S2NE4nZUYfPWctk56mN
UUQ9DUkbPRbLEJKCqVSQNagk6TEGe4dfRGdUNvAzDBglMTFOSrY1GAOJdUA1+bPb
3MnSdfyIyxSfPK5oDSQ4puMWKme2ZdGGPj+urSxs1Tuwkv0DxohdV+35WUIJcJPU
ARJecLX7rjyAzqqZE1sJGfsY5ob09380/BTAwHHP/KjiOFhilJ5OoHiU62D+mEKA
DHqlJzoj1VX/3d8=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
因此,当您开始验证过程时:
//you get the token
//you decode the token
//you compare the kid which is in the header of the token
//jwk.kid the one that you get when you visit the /.well-known url above
if (jwk.kid === decodedToken.header.kid){
// in verification process you have to use the decoded code and the certificate
// to verify the signature
}
Run Code Online (Sandbox Code Playgroud)
此过程特定于“RS256”算法。RS256 生成非对称签名,这意味着必须使用私钥对 JWT 进行签名,并且必须使用不同的公钥来验证签名。与对称算法不同,使用 RS256 可以保证 Auth0 是 JWT 的签名者,因为 Auth0 是唯一拥有私钥的一方。为了验证对称算法,您必须使用私钥。
| 归档时间: |
|
| 查看次数: |
7050 次 |
| 最近记录: |