带有入口 kubernetes 的 Spring Cloud oauth 2
Posted
技术标签:
【中文标题】带有入口 kubernetes 的 Spring Cloud oauth 2【英文标题】:Spring cloud oauth 2 with ingress kubernetes 【发布时间】:2020-01-21 05:05:15 【问题描述】:是否可以使用带有 kubernetes api 网关入口的 spring cloud oauth 2 服务器。
我已经在 zuul 中使用它来在拨打电话之前对用户进行身份验证。我可以对入口做类似的事情吗?
编辑 1:
为了更清楚地解释它,我想要实现的目标
我正在使用 spring cloud 提供的基于令牌的 oAuth2 实现。
-
oauth 作为 zuul 背后的服务之一运行。
zuul 为 oauth 服务器和资源服务器映射了路由
客户端通过zuul调用auth server并获取token。
客户端通过 zuul 调用资源服务器并传递令牌
zuul 配置为在调用资源服务器之前验证令牌。
通过这种方式,我们可以阻止任何下游流量在没有有效令牌的情况下通过。
我们可以在集群中运行身份验证服务器的入口中进行令牌验证吗?
【问题讨论】:
你找到解决办法了吗 【参考方案1】:我没有使用 Spring Cloud OAuth 2,但由于 OAuth 是一个标准,我相信如果您使用 nginx Ingress 作为入口控制器,您可以设置它,您可以指定外部 Oauth Provider(因为 OAuth 通常具有相同的流程) 在你的入口处像这样:
...
metadata:
name: application
annotations:
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
...
您可以通过使用 GitHub 作为 OAuth 提供者的示例找到更多信息 here
【讨论】:
请参阅编辑 1 。我们能做到这一点吗? spring cloud auth 还提供 2 个 url:oauth/token 和 oauth/authorize oauth2 是一个开放标准,所以从技术上讲,我会说是的,你可以让它工作,所有注释的完整描述here 我可以在集群内有一个专门用于该服务的服务,作为 oauth 的节点端口公开,然后是一个入口或大使过滤器访问它吗?【参考方案2】:目前有三种不同的 nginx-ingress-controllers (see here),它们的功能不同。我相信这些入口控制器本身都不能执行 oauth 令牌自省。但是,可以使用 auth_request 模块将请求路由到授权服务器的自省接口。
具体针对您的情况,您可以使用入口控制器中的 auth-url 注释 (see) 将请求定向到 spring cloud oauth2 服务器的自省接口 (see)。当使用 @EnableAuthorizationServer 时,默认情况下,自省接口在 /oaut/check_token 下可用。如果自省接口返回 2XX,则 ingress 将转发请求。此功能基于 auth_request 模块,如果允许访问,则需要来自外部服务的 2xx 响应代码,如果拒绝,则需要 401 或 403。
如果您使用 JWT 并希望仅通过检查签名来验证请求,则在某些情况下这实际上可以由入口本身完成。据我所知,只有 nginx 加入口控制器(付费)才能验证 JWT。但也有基于 nginx 的 kong-ingress 控制器,您可以配备 pulgins (see here)。有例如通过 oauth2 集成和 JWT 验证进行推广。
你发现的比我多吗?
【讨论】:
以上是关于带有入口 kubernetes 的 Spring Cloud oauth 2的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes nginx入口控制器不转发带有下划线的标头
带有 ALB 入口控制器的 Terraform AWS Kubernetes EKS 资源不会创建负载均衡器