我有一个前端,它与 Azure SSO 通信以登录,然后获取令牌作为反馈。
前端在每次请求时将令牌发送到我的 Spring Boot 后端以检查授权。
但是我的springboot无法检查令牌的签名,然后获取令牌的声明,因为秘密包含非法的base64字符,如“〜”(这是Azure在创建新客户端时生成的秘密)。
所以我有一个 JwtParser,由我的 SpringBoot Security 使用,有这两种方法:
public PublicKey generateJwtKeyDecryption(String jwtPublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyBytes = Base64.getDecoder().decode(jwtPublicKey);
X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(keyBytes);
return keyFactory.generatePublic(x509EncodedKeySpec);
}
public Claims extractAllClaims(String token) {
try {
return Jwts.parserBuilder()
.setSigningKey(generateJwtKeyDecryption(secretKey))
.build()
.parseClaimsJws(token)
.getBody();
} catch (JwtException | IllegalArgumentException | NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
return null;
}
感谢
.setSigninKey()
,我检查了我的令牌的签名,但正如我之前所说,我的秘密包含非法的 base64 字符。
只是为了检查我尝试使用不包含非法 base64 字符的“假”密钥,并且出现错误,表明签名不正确。
有人知道我该如何解决这个问题吗?或者,如果来自 Azure 的密钥实际上不是用于检查令牌签名的公钥? (算法为RS256)
如果您需要更多信息或澄清,请不要犹豫(抱歉我的英语不好)
客户端密钥不用于验证令牌。
使用来自 jwks_uri 端点的公钥。 您可以通过在此 URL 中设置您的租户 ID 来找到适合您的正确 URL:
https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration
或者,如果您有多租户应用程序,则可以输入“common”或“organizations”而不是租户 ID。 从该 JSON 文档中,您可以找到“jwks_uri”属性。该 URL 具有可用于验证令牌签名的公钥。