如何检查来自 Azure SSO 的令牌签名

问题描述 投票:0回答:1

我有一个前端,它与 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)

如果您需要更多信息或澄清,请不要犹豫(抱歉我的英语不好)

spring-boot azure spring-security single-sign-on token
1个回答
0
投票

客户端密钥不用于验证令牌。

使用来自 jwks_uri 端点的公钥。 您可以通过在此 URL 中设置您的租户 ID 来找到适合您的正确 URL:

https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration

或者,如果您有多租户应用程序,则可以输入“common”或“organizations”而不是租户 ID。 从该 JSON 文档中,您可以找到“jwks_uri”属性。该 URL 具有可用于验证令牌签名的公钥。

© www.soinside.com 2019 - 2024. All rights reserved.