V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MoonWalker
V2EX  ›  Java

网关与微服务间鉴权的疑惑

  •  1
     
  •   MoonWalker · 199 天前 · 2646 次点击
    这是一个创建于 199 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最佳实践是什么

    • 1:简单的在网关 filter 里加一个固定的 Token ,各个微服务校验这个 Token 的正确性
    • 2: 网络方案,利用防火墙让微服务仅接受来自网关的流量
    • 3: ?
    17 条回复    2024-05-07 18:08:35 +08:00
    crazycoding
        1
    crazycoding  
       199 天前   ❤️ 1
    1.网关登录保留用户登录信息,返回 token
    2.前端携带 token ,网关层校验 token ,网关层配置默认携带 token header 到各个微服务,各个微服务 filter 解析 token ,保存到 threadlocal ,用于各个微服务上下文获取登录信息
    MoonWalker
        2
    MoonWalker  
    OP
       199 天前
    @crazycoding 嗯你说的是正常从网关走到微服务的,我的意思是说如何避免直接绕过网关到微服务
    ChevalierLxc
        3
    ChevalierLxc  
       199 天前
    @MoonWalker 你都是网关了,外网就不应该直接能访问到你的微服务,微服务之间的调用,应该有 service secret 的东西调用,外网的 request 无法直接调用微服务。
    zuixinwenyue
        4
    zuixinwenyue  
       199 天前
    除了网关流量 其它的全部禁掉就好了,一般也不能直接请求微服务,暴露的应该是网关。
    ny562kPWNJK9g86f
        5
    ny562kPWNJK9g86f  
       199 天前
    不知道现在外部与网关是怎样鉴权的,当网关鉴权成功后,生成用户 token 通过 head 下发,在内网中各个服务应该是信任的。
    如果确实不信任,或者是敏感业务,可以要求网关生成 jwt token ,各个服务直接从里面获取用户信息,不需要回查其它服务。
    如果整个链路从外到内,都是 jwt token ,那就全部透传即可。
    retanoj
        6
    retanoj  
       199 天前
    @MoonWalker 网关和微服务之间也做认证
    比如服务注册时候派发证书,调用时建立 mTLS 通道
    或者服务注册时候派发 JWT ,调用校验
    buruoyanyang
        7
    buruoyanyang  
       199 天前
    我理解是网关后面的服务应该只能被网关和内部服务调用,可以通过防火墙实现。目前我们是通过 gateway 鉴权的请求都会把 token 解析成对应的用户信息,通过 header 或者其他方式向后续的服务传递。
    GeekGao
        8
    GeekGao  
       199 天前
    一般而言,是通过 mTLS ,Dapr 的实践是这样的。
    GeekGao
        9
    GeekGao  
       199 天前
    例子:
    Dapr 通过 mTLS 确保 Dapr sidecar 与 Dapr 控制平面系统服务之间的通信安全。当启用 mTLS 时,Sentry 服务(证书颁发机构)将根证书和颁发者证书写入 Kubernetes secret (在 Kubernetes 模式下)或配置的文件系统路径(在自托管模式下)。在 Kubernetes 中,Dapr 系统服务启动时,它们会自动挂载包含根证书和颁发者证书的 secret ,并使用这些证书来保护 Dapr sidecar 使用的 gRPC 服务器。在自托管模式下,每个系统服务可以挂载到文件系统路径以获取凭据。当 Dapr sidecar 初始化时,它会使用挂载的叶证书和颁发者私钥向系统 pods 进行身份验证,这些叶证书和私钥作为环境变量挂载在 sidecar 容器上
    9c04C5dO01Sw5DNL
        10
    9c04C5dO01Sw5DNL  
       199 天前
    所有请求走网关,网关转发到鉴权(含认证)服务,鉴权通过后返回用户基本信息给网关,网关将用户基本信息塞进 header 传递给内部服务。

    认证鉴权服务也可以塞到网关服务中。。。
    crysislinux
        11
    crysislinux  
       199 天前
    我感觉楼主想问的是网关和微服务之间以及多个微服务之间的通讯需不需要 authentication 吧。。我倾向于不做任何 authentication ,微服务都在一个 VPC 里,然后只有网关能访问这个 VPC ,微服务也只能被 VPC 内部别的微服务访问。
    zjyl1994
        12
    zjyl1994  
       199 天前
    我公司的环境是统一 gateway 鉴权,然后内网调用直接 grpc ,没有额外的校验。如果是金融性的重点接口才会自行约定一套签名方案让接入方实现,其他的都没有保护。所有服务的访问都必须经过 gateway ,无法直接连接到服务上。应该是做了网络隔离的。
    seedhk
        13
    seedhk  
       199 天前
    方案 2
    所有流量都走网关过,网关调研内部服务时携带用户信息
    limyel
        14
    limyel  
       199 天前
    避免请求绕过网关那个,可以借鉴 sa-token 的做法,请求经过网关的时候在请求头和 redis 里面塞一个值,然后服务端校验请求头的值和 redis 是否同一个,不是就返回异常。
    S4msara
        15
    S4msara  
       199 天前
    1. RequestInterceptor 把 Token 传递到下游程序之后,下游程序如果需要用户信息,可以解析 Token 获取用户基本信息,也可与再调用用户服务拿到完整用户对象;
    2. 用户认证通过后,把 Token 和用户信息放到 Redis ,下游服务连接相同 Redis 实例或副本,拿到 Token 之后到 Redis 取用户信息,用 ThreadLocal 存一份,随取随用。
    loveing
        16
    loveing  
       198 天前
    微服务之间都是“裸“奔的,无认证,无鉴权。
    MoonWalker
        17
    MoonWalker  
    OP
       198 天前
    最终: 花了一天时间改造成了下游服务采用双向的 TLS , 微服务加载需要的证书来调用下游。踩了好多坑,资料有点偏少...终归还是实现了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3355 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:59 · PVG 12:59 · LAX 20:59 · JFK 23:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.