网关转发到鉴权,鉴权再转到业务怎么写?

2021-11-24 16:21:11 +08:00
 MeloForsaken
  1. 如何把到网关的请求都转发到鉴权服务上?这个 route 得怎么写?
  2. 转发到鉴权服务上的请求,鉴权后如何再转发到业务上?是重定向到业务服务上?怎么知道端口和 IP ?还是再转会网关?
4320 次点击
所在节点    程序员
31 条回复
wantooo
2021-11-24 19:43:31 +08:00
spring cloud 情况下 request 到网关,自定义 globalFilter 通过 feign 调用鉴权服务,返回结果,决定是继续 chain 还是结束
qqlyatt
2021-11-24 20:10:48 +08:00
使用 Java 开发正常的业务流程应该是:1.普通浏览不用登录,用户点击某个特殊的 api 或者按钮需要登录。2.需要登录,前端页面,引导用户跳转进入《认证服务器 Authorization-Server 》的《认证》页面,用户在认证页面输入用户名密码或者手机号验证码,确认用户《身份》。3.确认用户后,《认证服务器》返回给前端授权码 authorization_code ,前端 NodeJS 服务器拿着授权码并组织一次 post 请求,在 POST 请求中携带自身的客户端用户名密码以及 redirect_uri ,这个是在《认证服务器》中注册过的客户端 client ,是把前端应用当作一个外来的客户端。这个 redirect_uri 是用来接收令牌 Token 的。《认证服务器》确认过全段服务器的用户名,密码和授权码,再验证当时注册 client 时填写过的 redirect_uri ,一致后,响应一个带有当前用户《身份权限》信息的 Token 。然后前端 NodeJS 将该 Token 存储起来存哪自己看 cookie,session,redis 。每次该用户调用资源服务的时候,也就是你的业务功能的时候,NodeJS 将他的令牌 Token 拿到,用一个类似过滤器的 func 将每次请求的请求头 Header 都加上 Key:Authorization Value:Bearer Token 值。这个请求可以直接发到网关上,也可以不用网关,直接请求到资源服务里,资源服务也能解析这个 Token 确认用户有没有权限请求这个资源。不过你是用网关的,所以,这个请求发到网关上,然后网关上过滤这个请求 Header ,验证这个用户的权限是否和他请求的资源地址匹配,如果不匹配,做出响应 403 无权限响应。如果匹配那就通过,并转发到资源服务器,获取资源服务器响应。如果你配置了 OAuth2+JWT ,网关过滤这一块不用手敲了,只需要简单的配置几下就行。
qqlyatt
2021-11-24 20:12:42 +08:00
网关上那个过滤请求 Header 的过程就叫做《鉴权》。
eason1874
2021-11-24 22:05:27 +08:00
@MeloForsaken 不是公共依赖,就拦截过滤

网关->鉴权->网关,这种是把请求转发给 Spring Cloud Gateway 匹配路由执行 Filters ,Filter 把权限信息加在 Headers 之后 Spring Cloud Gateway 再自己把请求转发给业务后端,相当于总共反代两次

还有一种常见的是类似微服务的形式,鉴权服务不管实际请求,只提供鉴权 HTTP API ,网关收到请求把信息发给鉴权 HTTP API ,拿到权限信息添加到 Headers 转发给后端

比如用 Nginx + ngx_lua 可以在 rewrite_by_lua 阶段请求鉴权 HTTP API ,把响应的权限信息写入 Nginx 变量,通过 proxy_set_header 传递给后端

location /openapi/ {
set $authinfo '';
rewrite_by_lua_block {
... resty.http 请求鉴权内网 HTTP API
ngx.var.authinfo = 响应的权限信息;
}
proxy_set_header "AuthInfo" $authinfo;
proxy_pass ...请求内网后端的反代配置
}

这样后端就可以在 HTTP Header 的 AuthInfo 里取当前用户和权限信息了
abobobo
2021-11-25 08:57:35 +08:00
目前我是鉴权+网关一个服务,认证一个服务,一个 url 如果需要登录( token )才能访问,网关的 filter 会对 url 进行鉴权,成功就转发到指定服务,不成功就返回失败提示。用的是 spring-cloud-gateway 跟 JWT 。
@MeloForsaken
Saxton
2021-11-25 09:11:14 +08:00
@abobobo 一大堆 github -》 zhoutaoo/SpringCloud
Saxton
2021-11-25 09:11:51 +08:00
@MeloForsaken @错人了 github-》 /zhoutaoo/SpringCloud
james2013
2021-11-25 11:05:34 +08:00
在网关里先调用鉴权接口,成功网关再转发到对应服务
转发到业务,明显是网关的活,关鉴权什么事?
nicholasxuu
2021-11-25 11:30:20 +08:00
@MeloForsaken 什么网关?
envoy 的话,可以用 ext_authz ( https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/ext_authz/v3/ext_authz.proto ),写个高性能的鉴权 rpc ,envoy 会去调用 rpc ,处理 request ,envoy 再把 request 传给后面的服务。
jiameng123
2021-11-25 12:03:18 +08:00
可以使用 openresty 实现,在指定的 location 中 rewrite_by_lua 模块中写 lua 脚本,发子请求,子请求应答回来判断成功后,再继续用该 location 后面的逻辑处理
chenfcheng
2021-11-25 13:14:39 +08:00
apisix 或者 阿里 api gateway 了解下 ? 鉴权都在网关上做了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX