在 Spring Boot2 中验证 Ouath2 JWT 令牌
Validate Ouath2 JWT token in Spring Boot2
我在验证由我的授权服务器生成的访问令牌时遇到问题
我使用 java 密钥工具生成 jks 文件并用它来签署令牌,我正在尝试使用 https://jwt.io/ 站点验证令牌。但它总是给出无效的签名
谁能指出这里的错误是什么?
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
.accessTokenConverter(defaultAccessTokenConverter());
}
@Bean
public TokenStore tokenStore() {
//return new JwtTokenStore(defaultAccessTokenConverter());
return new JwtTokenStore(defaultAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter defaultAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setKeyPair(keyPair());
return converter;
}
@Bean
public KeyPair keyPair() {
ClassPathResource ksFile = new ClassPathResource("test.jks");
KeyStoreKeyFactory ksFactory = new KeyStoreKeyFactory(ksFile, "k12345".toCharArray());
KeyPair keyPair = ksFactory.getKeyPair("testk");
return keyPair;
}
授权服务器生成的令牌
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI3NzgxNTUwODUsInVzZXJfbmFtZSI6InNhbWFuIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjM4YzkyMzJjLWFlYzAtNDcwNS1iM2Q3LTVlZTM5ZTc1YjhjMSIsImNsaWVudF9pZCI6InNhbWFuIiwic2NvcGUiOlsicmVhZCIsIndyaXRlIl19.H0zbOZSsZrrVNRb_U6WTd5vyL8x5egM7FUuzblhqshQMwQ8V_1ng7EQJwB88RuRfBHp0ndGsY2GxAxD6todJv4wv6-rNxn9cvWof6p_f2HdvANeeJi7TyURw4eQVy3jIBdSJIYr9aLnZ9MIg_WTVU8sdA_udQTXDC9dxZOKUiVUfnN3Xgn5rRtJTFbKZXvDD-3IJr5zOPWA7ZTcTrWuoDMqcY5abs4VH6YajxUiKjMFSynDxZOUCeQpbNteswJY2ujMBWbi2tp2YIUdARf4RhaFuoqY7tUeU2U0xh1LmVxbC7_2FIdLf5sjKdJHrC5uYm9byF3tQmfxTgMOjmosjDw
检索 Public 密钥
@RestController
public class TestController {
@GetMapping("/pub/pubkey2")
public String keys3() {
ClassPathResource ksFile = new ClassPathResource("test.jks");
KeyStoreKeyFactory ksFactory = new KeyStoreKeyFactory(ksFile, "k12345".toCharArray());
KeyPair keyPair = ksFactory.getKeyPair("testk");
PublicKey pubKey = keyPair.getPublic();
String key = Base64.encode(pubKey.getEncoded()).toJSONString();
return key;
}
}
trying to verify the token
从您分享的屏幕截图中,很遗憾,我无法识别您在 jwt.io 的“Public 键”字段中发布的输入字符串是什么样的。但是,鉴于您发布的“TestController”代码,我假设您粘贴了 public RSA 密钥的 Base64 编码版本。据我所知,jwt.io 希望您以纯文本形式输入密钥。
鉴于您使用 Springboot,我建议您编写一个简单的测试来断言签名并验证您的 JWT 是否按您预期的方式工作。这种方法还将帮助您调试代码/识别问题,而无需使用 jwt.io.
等外部服务
旁注:在实施您自己的某些 public 密钥交换端点和协议版本之前,我建议先查看 JSON Web 密钥 (JWK) 规范(RFC 7517 ).
我在验证由我的授权服务器生成的访问令牌时遇到问题 我使用 java 密钥工具生成 jks 文件并用它来签署令牌,我正在尝试使用 https://jwt.io/ 站点验证令牌。但它总是给出无效的签名
谁能指出这里的错误是什么?
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
.accessTokenConverter(defaultAccessTokenConverter());
}
@Bean
public TokenStore tokenStore() {
//return new JwtTokenStore(defaultAccessTokenConverter());
return new JwtTokenStore(defaultAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter defaultAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setKeyPair(keyPair());
return converter;
}
@Bean
public KeyPair keyPair() {
ClassPathResource ksFile = new ClassPathResource("test.jks");
KeyStoreKeyFactory ksFactory = new KeyStoreKeyFactory(ksFile, "k12345".toCharArray());
KeyPair keyPair = ksFactory.getKeyPair("testk");
return keyPair;
}
授权服务器生成的令牌
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI3NzgxNTUwODUsInVzZXJfbmFtZSI6InNhbWFuIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjM4YzkyMzJjLWFlYzAtNDcwNS1iM2Q3LTVlZTM5ZTc1YjhjMSIsImNsaWVudF9pZCI6InNhbWFuIiwic2NvcGUiOlsicmVhZCIsIndyaXRlIl19.H0zbOZSsZrrVNRb_U6WTd5vyL8x5egM7FUuzblhqshQMwQ8V_1ng7EQJwB88RuRfBHp0ndGsY2GxAxD6todJv4wv6-rNxn9cvWof6p_f2HdvANeeJi7TyURw4eQVy3jIBdSJIYr9aLnZ9MIg_WTVU8sdA_udQTXDC9dxZOKUiVUfnN3Xgn5rRtJTFbKZXvDD-3IJr5zOPWA7ZTcTrWuoDMqcY5abs4VH6YajxUiKjMFSynDxZOUCeQpbNteswJY2ujMBWbi2tp2YIUdARf4RhaFuoqY7tUeU2U0xh1LmVxbC7_2FIdLf5sjKdJHrC5uYm9byF3tQmfxTgMOjmosjDw
检索 Public 密钥
@RestController
public class TestController {
@GetMapping("/pub/pubkey2")
public String keys3() {
ClassPathResource ksFile = new ClassPathResource("test.jks");
KeyStoreKeyFactory ksFactory = new KeyStoreKeyFactory(ksFile, "k12345".toCharArray());
KeyPair keyPair = ksFactory.getKeyPair("testk");
PublicKey pubKey = keyPair.getPublic();
String key = Base64.encode(pubKey.getEncoded()).toJSONString();
return key;
}
}
trying to verify the token
从您分享的屏幕截图中,很遗憾,我无法识别您在 jwt.io 的“Public 键”字段中发布的输入字符串是什么样的。但是,鉴于您发布的“TestController”代码,我假设您粘贴了 public RSA 密钥的 Base64 编码版本。据我所知,jwt.io 希望您以纯文本形式输入密钥。
鉴于您使用 Springboot,我建议您编写一个简单的测试来断言签名并验证您的 JWT 是否按您预期的方式工作。这种方法还将帮助您调试代码/识别问题,而无需使用 jwt.io.
等外部服务旁注:在实施您自己的某些 public 密钥交换端点和协议版本之前,我建议先查看 JSON Web 密钥 (JWK) 规范(RFC 7517 ).