java - 在 Spring Boot 2 中验证 Oauth2 JWT token

标签 java spring-boot oauth-2.0 jwt access-token

我在验证我的身份验证服务器生成的访问 token 时遇到问题 我使用 java key 工具生成 jks 文件并使用它来签署 token ,我尝试使用 https://jwt.io/ 验证 token 地点。但它总是给出无效签名

有人能指出这里的错误是什么吗?

@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;
}

认证服务器生成的 token

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI3NzgxNTUwODUsInVzZXJfbmFtZSI6InNhbWFuIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjM4YzkyMzJjLWFlYzAtNDcwNS1iM2Q3LTVlZTM5ZTc1YjhjMSIsImNsaWVudF9pZCI6InNhbWFuIiwic2NvcGUiOlsicmVhZCIsIndyaXRlIl19.H0zbOZSsZrrVNRb_U6WTd5vyL8x5egM7FUuzblhqshQMwQ8V_1ng7EQJwB88RuRfBHp0ndGsY2GxAxD6todJv4wv6-rNxn9cvWof6p_f2HdvANeeJi7TyURw4eQVy3jIBdSJIYr9aLnZ9MIg_WTVU8sdA_udQTXDC9dxZOKUiVUfnN3Xgn5rRtJTFbKZXvDD-3IJr5zOPWA7ZTcTrWuoDMqcY5abs4VH6YajxUiKjMFSynDxZOUCeQpbNteswJY2ujMBWbi2tp2YIUdARf4RhaFuoqY7tUeU2U0xh1LmVxbC7_2FIdLf5sjKdJHrC5uYm9byF3tQmfxTgMOjmosjDw

检索公钥

@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 的“公钥”字段中的输入字符串。但是,鉴于您发布的“TestController”代码,我假设您粘贴了 RSA 公钥的 Base64 编码版本。据我所知,jwt.io 希望您以纯文本形式输入 key 。

鉴于您使用 Springboot,我建议您编写一个简单的测试来断言签名并验证您的 JWT 按您期望的方式工作。这种方法还可以帮助您调试代码/识别问题,而无需使用 jwt.io 等外部服务。

旁注:在实现您自己的某些公钥交换端点和协议(protocol)版本之前,我建议您先查看一下 JSON Web Key (JWK) 规范 ( RFC 7517 )。

关于java - 在 Spring Boot 2 中验证 Oauth2 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598631/

相关文章:

java - Tomcat 的 LDAP 身份验证 - 403 错误

java - 从 Spring 应用程序连接到 Cassandra 池的问题

azure - 无需登录即可对 Azure REST API 进行身份验证

java - 在 Java 中如何获取字符串输入以接受可能的整数?

java - 在二进制类型上使用 IMethod.exists() 方法

java - Docker容器无法将日志发送到docker ELK堆栈

maven - 如何将maven多模块spring boot部署到docker容器

android - 带有 oAuth 2.0 的 Picasa API

oauth-2.0 - 在 Open ID 连接中解释离线 token 验证与在线 token 验证?优势、局限性和权衡

Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值