2017-10-16 523 views
0

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

的理念是:

  1. 一个安全的REST服务 “生产者”
    • 提供端点GET /人所有用户/与角色 “read_person”
    • 校长提供一个端点POST /个人角色为“write_person”的所有用户/负责人
  2. 另一个(无担保)REST服务“The Consumer”
    • 提供了一个enpoint/API开放给大家
    • 使用RequestInterceptor传递的accessToken(签署JWT/JWS)

我读通过Feign客户端调用内部的 “生产者”文档:

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

说:

一旦客户端应用程序启动时,它允许使用URL如http://myhost.com/myapp/k_jwks,>假设http://myhost.com/myapp是你的客户的基础URL>应用程序下载在JWKS格式公共>键。这个URL可以被Keycloak使用(见下文)。

在认证过程中,客户端生成一个JWT令牌,并使用>其私钥对其进行签名,并将其发送到Keycloak中client_assertion>参数中特定backchannel>请求(例如,代码到令牌请求)。

我搜索了很多关于这个主题的教程/演示或文档,但到目前为止失败了。 所以在这里我的问题:

  1. 如何实现这个 “k_jwk” 终点?在“制片人”中,我自己简单地制作一个@RestController吗?如何配置Keycloak以了解此URL?

  2. 我该如何实施我的“消费者”才能从Keycloak获得新签署的智威汤逊?

更新 即将移除刺激性PS声明。

+0

为什么要重新实现这一切,因为我们已经做在春节引导适配器? –

+0

请告诉我如何在这里使用Keycloak Adapater。我找不到任何演示或文档。 – HaVonTe

+0

http://www.keycloak.org/docs/latest/securing_apps/topics/oidc/java/spring-boot-adapter.html,同时检查我的博客帖子https://developers.redhat.com/blog/2017/ 05/25 /轻松保护您的弹簧启动应用程序与keycloak /或我们的快速入门https://github.com/keycloak/keycloak-quickstarts –

回答

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

    ...

    keycloak.credentials.jwt.client-密钥库文件=类路径:密钥库client.jks keycloak.credentials.jwt.client-密钥库型= JKS

    等等

  2. 你需要一个令牌来调用producer但正如你所说的切入点将是一个insecured端点所以你可能要使用这个Service Account

我希望这会有所帮助。

+0

好的,thx。第一个信息非常方便。我将尝试了解并实施此服务帐户主题。 – HaVonTe

+0

我可能需要进一步的帮助。 我使用正确的keycloak设置和gradle依赖项中的适配器设置了一个客户端应用程序。我创建了Feign客户端(RestTemplate对我来说也不错)。怎么办?我如何生成智威汤逊? 我不明白与服务帐户的提示。该文档说: http://www.keycloak.org/docs/2.5/server_admin/topics/clients/oidc/service-accounts.html 总结:从keycloak抓取令牌 POST/auth/realms/demo /协议/ openid连接/令牌 所以我必须写这个由我自己? – HaVonTe

+0

是的,如果你想使用签名JWT作为客户端认证,可能需要做一些手动工作,但你可以利用这个类来获得jwt令牌https://github.com/keycloak/keycloak/blob/master/适配器/ OIDC /适配器核/ src目录/主/ JAVA /组织/ keycloak /适配器/认证/ JWTClientCredentialsProvider.java –

0

更新

我想不出解决这个问题,但了解singned智威汤逊一些事情的平均时间:

  1. 通过创建一个JSON结构创建一个所谓的“承载令牌”并附上所有必要的声明(sub,nbf,exp ...),并使用Keycloak的JKS/Private Key对其进行签名/证明。 Keycloak旁边有一些不错的第三方库可以做到这一点。

  2. 从Keycloak得到一个真正的accessToken(JWE/JWS):发送此静态最终承载令牌在/认证/境界/ $境界/协议/ OpenID的连接/令牌Keycloak /内省

与QueryParams:

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

  • 使用接收真正的accessToken访问ResourceServer ...