用Kong认证

iLi*_*ast 6 authentication django restful-authentication microservices kong

我正在寻找Kong来取代我目前手工推出的NodeJS API网关.目前,我有一个用户服务,通过在登录时提供JWT来处理身份验证(用Django编写),然后客户端通过标头传入.我现在的API网关然后拦截任何电话,也确实验证调用返回给用户的服务,并与替换JWT报头X-User-IdX-User-Email.

据我所知,孔可以大致做同样的事情.我试图弄清楚这应该如何在一个完美的世界中发挥作用.我仍然有机会更换大部分基础设施,因此重写一些服务并非完全不可能.

所以,在我看来,会发生以下情况:

  1. 用户在我的网站上注册.然后我在Kong上用他们的用户名/ id创建一个新的消费者
  2. 用户登录.这是我卡住的地方.我是否登录(或者在这种情况下,只是将用户认证为所述用户),向Kong询问此消费者的JWT,然后返回?如果我想在JWT的有效载荷中获得更多数据怎么办?当JWT到期时,Kong会发生什么?
  3. 当用户请求服务时,Kong将从标题中嗅出JWT,替换为X-Consumer-*- 这是正确的吗?

如果我的想法错了,或者有更好的方法来实现这一点,请纠正我.我对整个微服务的事情都很陌生.

小智 1

我正在研究类似的设置,这些是我目前的发现/结论:

用户注册必须按照您描述的方式进行。

登录后,我确实相信有两种可能的方法可以解决此问题:

  1. 将consumer_id存储在您的用户数据库中,
  2. 将 jwt 密钥和机密存储在您的用户数据库中。

在场景 1 中,您必须从 kong 获取 jwt 密钥和机密,并生成 jwt 令牌,并使用此令牌向您的 kong 服务发出请求。

场景 2 与场景 1 几乎相同,只是您不必向 kong 发出任何请求来生成 jwt 令牌。

您可以向 jwt 令牌添加其他有效负载参数,但这些参数不会传递到您的上游服务。不过,这个插件似乎解决了这个问题(我还没有测试过):

https://github.com/wshirey/kong-plugin-jwt-claims-headers

Kong 在授权后将 custom_id 和用户名从 jwt 消费者传递到上游服务,如下所示:

x-consumer-custom-id: [245]
x-consumer-username: ['my-test-user']
x-consumer-id: ['1e9e25dd-396f-4195-94fc-f2a8bd8447a2']
Run Code Online (Sandbox Code Playgroud)

它还传递整个授权标头