Spring OAuth2 中的 HMACSHA512 不起作用

Posted

技术标签:

【中文标题】Spring OAuth2 中的 HMACSHA512 不起作用【英文标题】:HMACSHA512 in Spring OAuth2 doesn't work 【发布时间】:2018-07-17 16:33:13 【问题描述】:

你能帮我写代码吗?我正在尝试在 Spring Security 中实现 OAuth2 以在我的网站上进行 jwt 身份验证。我已经实现了 AuthorizationServerConfig 和 ResourceServerConfig,以及一些我声明了 bean 的 SecurityConfig。 bean 之一是访问令牌转换器。

这是我的实现:

@Bean
@Primary
public JwtAccessTokenConverter accessTokenConverter() 
    JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
    jwtAccessTokenConverter.setSigner(new MacSigner("HMACSHA512", new SecretKeySpec("secret_password".getBytes(), "HMACSHA512")));
    return jwtAccessTokenConverter;

生成了令牌,但是当我尝试使用此令牌调用一些 api 时,我在邮递员中收到此错误:


    "error": "invalid_token",
    "error_description": "Cannot convert access token to JSON"

当我替换这一行时:

jwtAccessTokenConverter.setSigner(new MacSigner("HMACSHA512", new SecretKeySpec("secret_password".getBytes(), "HMACSHA512")));

用这一行:

jwtAccessTokenConverter.setSigningKey("secret_password");

令牌生成和授权也同样有效。但它使用默认的 HS256。你能告诉我如何修复我的代码以使用 HS512 吗?谢谢。

【问题讨论】:

@dur 我也尝试了你的第二个建议,我使用这个新的 MacSigner("HMACSHA512", new SecretKeySpec("secret_password".getBytes(), "HMACSHA512")) 作为新变量并将其设置为签名者和验证者,我认为它有效:) 但只是额外的问题......如果它是一个好的程序? 为什么你认为这不是一个好的程序? 顺便说一句:我已经回答了你的问题here。您是否认为,您的新问题与旧问题重复?如果您愿意,我可以将您的(现在工作的代码)复制到我的答案中。我没有添加一些代码,因为我还不能测试它。 Spring OAuth2 - Change default signing algorithm的可能重复 【参考方案1】:

我们可以通过添加java-jwt依赖来实现HMACSHA_512算法。

Maven 依赖

<dependency>
<groupid>com.auth0</groupid>
<artifactId>java-jwt</artifactId>
<version>3.8.0</version>
</dependency>

Gradle 依赖

implementation 'com.auth0:java-jwt:3.8.0'

生成 JWT 令牌

第 1 步:构建标头信息

Map<String, Object> map = new HashMap<String, Object>();
map.put("alg", "HS512");
map.put("typ", "JWT");

第二步:构造关键信息

Algorithm algorithm = Algorithm.HMAC256("secret");  //secret key

第三步:我们通过定义注册和自定义声明,结合header和key信息生成jwt token

String token = JWT.create()
.withHeader(map)// Setting Header information 
.withIssuer("SERVICE")//Setting load signatures is who generates, for example, servers
.withSubject("this is test token")//Setting the theme of load signature
// .withNotBefore(new Date()) / / set the load definition before any time, and the jwt is not available.
.withAudience("APP")//Audiences who set payload signatures can also understand who accepts signatures
.withIssuedAt(nowDate) //Set the time when the payload generates the signature
.withExpiresAt(expireDate)//Setting the expiration time of load signature
.sign(algorithm);//Signature

【讨论】:

【参考方案2】:

将您的算法更改为 512 您需要将服务器/资源 JwtAccessTokenConverter setVerifier 设置为与 setSigner 所做的相同,例如:

jwtAccessTokenConverter.setVerifier(MacSigner("HMACSHA512", SecretKeySpec("secret_password".toByteArray(), "HMACSHA512")))

记住:两者都需要设置

【讨论】:

以上是关于Spring OAuth2 中的 HMACSHA512 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Oauth2 中的 CORS 错误

Grails 中的 Spring Oauth2 提供程序 - 依赖项

Oauth2 Spring中的JWT令牌

什么是使用 Spring Cloud 微服务的 OAuth2 中的资源服务器

Spring OAuth2 中的 HMACSHA512 不起作用

单个 Spring Boot 应用程序中的 SAML 和 Oauth2