【问题标题】:jwt validation in backend springboot后端springboot中的jwt验证
【发布时间】:2019-08-05 09:43:37
【问题描述】:

我希望创建一个 Angular 应用程序,该应用程序登录 springboot 中创建的新身份验证服务器并返回一个 jwt。

这个想法是创建应用程序,以便能够根据屏幕中提供的用户/密码使用私钥生成和签署 jwt 令牌,身份验证服务器将验证数据库中的登录信息并生成 jwt 令牌.

之后,请求将被发送到另一个微服务,在这里我需要能够验证令牌,但是这个微服务不会以任何方式连接到身份验证服务或数据库,它只会验证完整性使用公钥的令牌。

我到处寻找,但找不到能够验证令牌的线索,我找到了这段代码,但由于某种原因,当我执行其余 API 时,该代码未执行:

@Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();


        Resource resource = new ClassPathResource("public.txt");
        String publicKey = null;

        try {
            publicKey = IOUtils.toString(resource.getInputStream(), Charset.defaultCharset());
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
        converter.setVerifierKey(publicKey);
        return converter;
    }

我想做什么有意义吗?

谢谢 问候

【问题讨论】:

    标签: spring-boot jwt


    【解决方案1】:

    您的身份验证服务器将需要成为您的微服务的 JWT 的单一发行者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发出一个使用私钥签名的 JWT(签名必须是非对称的 - RS256 就是一个示例),您只保留在身份验证服务器上;不要将此私钥提供给您希望在其中验证 JWT 的其他微服务。您可以做的是根据您签署令牌的私钥派生一个公钥,并将其发布到不需要身份验证的身份验证服务器上的端点 - 公钥将以 JWK 的形式表示(see link to spec )。谷歌做了类似的事情here。然后,在您的每个微服务中,您需要设计一种方法,每 X 分钟向您的身份验证服务器上的公钥端点发出 GET 请求,并在每个微服务中缓存公钥。

    然后,每当请求进入您的一个微服务时,您就会获取 JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的美妙之处在于,您可以仅根据公钥验证令牌,但不能对其进行签名。因此,只要每个服务都拥有来自您的 /cert 端点的公钥,它们就可以验证令牌,而无需与身份验证服务器对话或知道私钥。

    这将需要更多的前期工作,但知道只有一个来源知道您的私钥,将来会为您带来大量的轻松、灵活性和安心。

    我建议使用this library 进行 JWT 验证。

    整体架构最终将如下所示:

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2022-07-22
      • 1970-01-01
      • 2020-09-10
      • 2020-03-09
      • 2021-08-04
      • 2017-10-02
      • 2019-01-09
      • 2017-03-11
      相关资源
      最近更新 更多