繁体   English   中英

在Spring Boot中使用Keycloak实现JWT,JWE和JWS(签名的JWT)

[英]Implementing JWT, JWE and JWS (signed JWT) with Keycloak in Spring Boot

我尝试使用Spring Boot和Keycloak作为AuthService来实现一个简单的OAuth2“使用签名的JWT进行客户端身份验证”演示应用程序。

这个想法是:

  1. 一项安全的REST服务“生产者”
    • 为所有具有角色“ read_person”的用户/主体提供端点GET / person
    • 为所有用户/角色提供端点POST / person,角色为“ write_person”
  2. 另一个(不安全的)REST服务“消费者”
    • 为所有人提供一个enpoint / api开放
    • 通过Feign客户端使用RequestInterceptor调用内部的“生产者”以传递AccessToken(签名的JWT / JWS)

我阅读了有关文档:

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/client-authentication.html

他说:

客户端应用程序启动后,就可以使用http://myhost.com/myapp/k_jwks之类的URL以JWKS格式下载其公共密钥,前提是假定http://myhost.com/myapp是基础您的客户端>应用程序的URL。 Keycloak可以使用此URL(请参见下文)。

在身份验证期间,客户端会生成一个JWT令牌,并使用其私钥对其进行签名,然后在client_assertion>参数中的特定反向通道请求(例如,代码令牌请求)中将其发送到Keycloak。

我在Google上进行了大量搜索,以找到有关此主题的教程/演示或文档,但到目前为止仍失败。 所以这是我的问题:

  1. 如何实现此“ k_jwk”端点? 我是否自己在“生产者”中简单地构建@RestController 如何配置Keycloak来了解此URL?

  2. 如何实现我的“消费者”以从Keycloak获得新的签名JWT?

更新删除了烦人的PS语句。

  1. 您不需要实现k_jwk端点,这是由适配器处理的。 默认情况下,Keycloak将查看http:///your.app.com/k_jwk (但如果需要,您可以在控制台中覆盖它)。 然后,您需要配置Spring Boot客户端,只需使用与keycloak.json相同的属性,但格式为application.properties:

    ...

    keycloak.credentials.jwt.client-keystore-file = classpath:keystore-client.jks keycloak.credentials.jwt.client-keystore-type = JKS

    等...

  2. 您需要一个令牌来调用producer但是正如您所说的,入口点将是一个不安全的端点,因此您可能要为此使用服务帐户

我希望这将有所帮助。

更新

我无法解决此问题,但与此同时了解了一些关于JWT的知识:

  1. 通过自己创建具有所有必要声明(sub,nbf,exp ...)的Json结构并使用Keycloak的JKS /私钥对其进行签名/验证,从而创建所谓的“承载者令牌”。 在Keycloak旁边有一些不错的第三方库可以做到这一点。

  2. 要从Keycloak获取真实的AccessToken(JWE / JWS):在/ auth / realms / $ realm / protocol / openid-connect / token / introspect将此静态最终承载令牌发送到Keycloak

使用QueryParams:

grant_type = client_credentials&client_assertion_type =瓮%3Aietf%3Aparams%3Aoauth%3Aclient断言型%3Ajwt承载&client_assertion = $ BEARER_TOKEN

  1. 使用接收到的真实AccessToken访问ResourceServer ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM