我希望创建一个有角度的应用程序,该应用程序登录到在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;
}
我试图做的事有意义吗?
谢谢 问候
答案 0 :(得分:0)
您的身份验证服务器将需要成为微服务的JWT的唯一颁发者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发布一个使用私钥签名的JWT(签名必须不对称-RS256是一个示例),您只需保留在身份验证服务器上即可;不要将此私钥提供给您希望在其中验证JWT的其他微服务。您可以根据签名令牌的私钥来派生公钥,并将其发布到不需要身份验证的身份验证服务器上的端点-公钥将以JWK的形式表示({{3 }})。 Google做了类似的see link to spec。然后,在每个微服务中,您需要设计一种方法,每隔X分钟向auth服务器上的公钥端点发出GET请求,并将公钥缓存在每个微服务中。
然后,无论何时有请求进入您的微服务之一,您都将抓住JWT,检查其有效性,并在令牌有效的情况下授予访问/授权。使用私钥/公钥对和非对称密钥签名的好处在于,您可以仅基于公钥来验证令牌,但不能对其进行签名。因此,只要每个服务都具有来自/ cert端点的公钥,它们就可以验证令牌,而无需与auth服务器交谈或知道私钥。
这将需要做更多的事,但是将来,只有一个来源知道您的私钥,您才能获得大量的轻松,灵活和安心。
我建议使用here进行JWT验证。
整体架构最终看起来像这样: this library