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

2021-11-24 16:21:11 +08:00
 MeloForsaken
  1. 如何把到网关的请求都转发到鉴权服务上?这个 route 得怎么写?
  2. 转发到鉴权服务上的请求,鉴权后如何再转发到业务上?是重定向到业务服务上?怎么知道端口和 IP ?还是再转会网关?
4291 次点击
所在节点    程序员
31 条回复
retanoj
2021-11-24 16:24:19 +08:00
感觉不是个 route ,是个 filter
FanError
2021-11-24 16:29:13 +08:00
最近也在学习这方面东东,似乎现在常用的方案是把鉴权直接在网关上做的。

业务上不做任何鉴权操作
MeloForsaken
2021-11-24 16:30:09 +08:00
@retanoj 是的,是我理解错了,但是 filter 里怎么转发到鉴权服务上(不用真正的 ip 和端口)
sxfscool
2021-11-24 16:30:46 +08:00
业务不做鉴权,鉴权的信息当成参数传递到子服务
MeloForsaken
2021-11-24 16:37:33 +08:00
@sxfscool @FanError 业务和鉴权分开的啊,鉴权是单独的一个服务
FanError
2021-11-24 16:44:47 +08:00
@MeloForsaken 网上的方案全部是在网关上做的,所以不存在转发这个问题

鉴权通过了,直接到业务模块
eason1874
2021-11-24 16:49:41 +08:00
什么怎么写,不就写拦截器那样写么,这问题问得太宽泛,很难答。你要问具体哪个语言的怎么说,大家还可以给你推荐一些框架例子

如果不大懂,干脆用软件方案得了,APISIX 之类的开源 API 网关,带控制台,可以像用云厂商 API 网关服务那样配置
anonydmer
2021-11-24 16:51:55 +08:00
1. 是认证还是鉴权?两者不一样。认证容易统一处理,但是鉴权视业务需求而定,复杂的鉴权只能是业务方自己做
2. 不管你是认证还是授权服务独立出来了,参照一楼,应该用 filter 而不是 route ;如果用 route 不是把鉴权服务又做成网关服务了?
abersheeran
2021-11-24 16:54:59 +08:00
你是想让鉴权服务提供 RPC ,然后网关去调用吧?
kifile
2021-11-24 16:55:49 +08:00
aop 切面,注解鉴权处理
abobobo
2021-11-24 17:03:04 +08:00
网关写个 filter ,在网关验证请求头部带的 token , 验证通过后通过服务名转发到业务上(在 gateway 里配置好 服务名称以及匹配规则)
retanoj
2021-11-24 17:26:37 +08:00
“转发”的意思可以是将 HTTP 请求原封不动的发往另一个目的地
在这里也可以理解为解析请求,做一些业务逻辑(比如认证检查),再取出一些调用的服务,参数,进行(远程?)服务调用
nicholasxuu
2021-11-24 17:38:28 +08:00
我们是 envoy 鉴权 filter 在 request 上加个 header (内部不会冲突的 header 名,如果用户传了就删掉),然后业务直接读 header 就行了。
securityCoding
2021-11-24 17:43:20 +08:00
这提问也是醉了,至少带个技术栈啊

如何把到网关的请求都转发到鉴权服务上?
自定义 filter

这个 route 得怎么写?
route 里面配置一下鉴权的 filter

转发到鉴权服务上的请求
不用转发,filter 里面请求认证服务

鉴权后如何再转发到业务上?
网关本身就是 proxy 角色,不用再次转发

是重定向到业务服务上?
接上

怎么知道端口和 IP ?
网关里面一般会有目标服务概念. spring-cloud-gateway 是服务注册名,内置默认 filter 自动查询可用节点

还是再转会网关?
网关本身就是 proxy


综上,你需要先把网关涉及的概念弄清楚,再重新组织一下问题
SuperShuYe
2021-11-24 17:47:12 +08:00
GW 服务(外网):
gw.abc.com 鉴权后 header 携带 token
这里配置转发 172.168.0.1 gw.abc.com/order 172.168.0.2 gw.abc.com/user
Order 服务(内网):
172.168.0.1 gw.abc.com/order
User 服务(内网) :
172.168.0.2 gw.abc.com/user
Saxton
2021-11-24 17:51:57 +08:00
鉴权中心永远只负责鉴权,逻辑不要搞错了,转发权还是在网关身上,目前我们的系统的是
请求 -》网关-》鉴权-》 网关-》 转发到对应服务,对应的服务不需要在鉴权了,当然有些系统的架构服务的调用也需要额外的鉴权,网关会签发一个临时的调用 TOKEN 和一个用户 TOKEN 一起转发到对应服务,对应服务在拦截这个 token 鉴别,但其实没必要多做一步,你要做的是完全信任鉴权中心和防火墙
Saxton
2021-11-24 17:55:44 +08:00
你也没说你的技术栈是什么
传统的 springcloud 可以直接在 spring-cloud-gateway 上跑鉴权
但我的做法我喜欢另外跑一个鉴权中心,这个鉴权中心同时还承担了签证责任,网关永远只是一个负责转发的东西,不要把过多的逻辑压在网关身上
MeloForsaken
2021-11-24 18:54:33 +08:00
@Saxton 是 springcloud ,没有讲清楚,按你的意思,网关->鉴权->网关,这个得怎么实现?网上没有找到具体的实现方式
MeloForsaken
2021-11-24 19:10:10 +08:00
@abersheeran @abobobo @nicholasxuu @securityCoding @eason1874 @anonydmer spring cloud ,打个比方 URL 鉴权,网关和鉴权是两个服务,网关具体怎么去调用? RPC ?把鉴权抽离成公共依赖?还是有什么其他比较好的写法?
yangyaofei
2021-11-24 19:35:52 +08:00
oauth2?

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

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

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

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

© 2021 V2EX