spring-security 取代已停用的Spring Security JwtHelper

tuwxkamq  于 2022-11-11  发布在  Spring
关注(0)|答案(4)|浏览(269)

我使用org.springframework.security:spring-security-jwt:1.1.0.RELEASE中的org.springframework.security.jwt.JwtHelper类来解码JWT标记,例如:

Jwt jwt = JwtHelper.decode(accessToken);
String claims = jwt.getClaims();

上述类别已过时,且过时注解指向Spring Security OAuth 2.0 Migration Guide
本指南不讨论JwtHelper的任何替代品。
我在新的spring-security-oauth2项目中发现了JwtDecoders类,它创建了一个JwtDecoder。但是JwtDecoders需要一个issuer来传递。
由于我不想验证令牌,是否有简单的替代方法?否则,我可以在.和base64上拆分-解码令牌,并使用任何JSON库进行解析。

bvjveswy

bvjveswy1#

Spring Security中使用的替代版本是nimbus-jose-jwt。如果您不使用Sping Boot ,则必须选择一个版本,否则Spring Boot将为您选择一个版本。

<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
</dependency>

您可以像这样使用它:

import com.nimbusds.jwt.JWTParser;

....

JWT jwt = JWTParser.parse(accessToken)
Header = jwt.getHeader();
JWTClaimsSet jwtClaimSet = jwt.getJWTClaimsSet();
mepcadol

mepcadol2#

这对我来说很好,没有任何新的依赖关系

Jws<Claims> claimsJws = Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor("secretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecret".getBytes()))
                .build().parseClaimsJws(token);
        String username = claimsJws.getBody().getSubject();
        Authentication authentication = new UsernamePasswordAuthenticationToken(username,null, null);
        SecurityContextHolder.getContext().setAuthentication(authentication);
yeotifhr

yeotifhr3#

请勿跳过令牌验证!未能正确验证令牌将导致应用程序不安全。

  • 请务必检查令牌的颁发者(iss声明)并验证其是否正确,以及您的应用程序是否应该接受该令牌。仅接受来自有权为您的应用程序授予访问令牌的颁发者的令牌。
  • 此外,请验证令牌是否适用于您的应用(请检查并声明):您不希望用户滥用用于其他应用程序的令牌(例如,如果用户的令牌具有所有正确声明,但aud声明设置为另一个应用程序;这对您来说不应该是有效令牌)。
  • 现在,请务必检查令牌的签名,以验证它确实是由颁发者签名的,而不是伪造的令牌:如果您没有直接从颁发者处获取公钥,并且没有正确验证传入令牌的签名,恶意用户将能够伪造您的应用将接受的看似有效的令牌,您的应用将面临泄漏灾难性数据量的风险。
  • 最后一步是检查有效性(是否过期?),然后检查应用预期和要求的任何其他声明或作用域。
8ulbf1ek

8ulbf1ek4#

如果您希望避免额外的依赖项(例如nimbus-jose-jwt),请随意派生或复制以下小实用程序类:JwtUtils.java

相关问题