OAuth 2.0 实战课
王新栋
京东资深架构师
16397 人已学习
新⼈⾸单¥29
登录后,你可以任选2讲全文学习
课程目录
已完结/共 17 讲
开篇词 (1讲)
OAuth 2.0 实战课
15
15
1.0x
00:00/00:00
登录|注册

12 | 架构案例:基于OAuth 2.0/JWT的微服务参考架构

你好,我是王新栋。
在前面几讲,我们一起学习了 OAuth 2.0 在开放环境中的使用过程。那么 OAuth 2.0 不仅仅可以用在开放的场景中,它可以应用到我们任何需要授权 / 鉴权的地方,包括微服务。
因此今天,我特别邀请了我的朋友杨波,来和你分享一个基于 OAuth 2.0/JWT 的微服务参考架构。杨波,曾先后担任过携程框架部的研发总监和拍拍贷基础架构部的研发总监,在微服务和 OAuth 2.0 有非常丰富的实践经验。
其中,在携程工作期间,他负责过携程的 API 网关产品的研发工作,包括它和携程的令牌服务的集成;在拍拍贷工作期间,他负责过拍拍贷的令牌服务的研发和运维工作。这两家公司的令牌服务和 OAuth 2.0 类似,但要更简单些。
接下来,我们就开始学习杨波老师给我们带来的内容吧。
你好,我是杨波。
从单体到微服务架构的演进,是当前企业数字化转型的一大趋势。OAuth 2.0是当前业界标准的授权协议,它的核心是若干个针对不同场景的令牌颁发和管理流程;而JWT是一种轻量级、自包含的令牌,可用于在微服务间安全地传递用户信息。
据我目前了解到的情况,虽然有不少企业已经部分或全部转型到微服务架构,但是在授权认证机制方面,它们一般都是定制自研的,比方说携程和拍拍贷的令牌服务。之所以定制自研,主要原因在于标准的 OAuth 2.0 协议相对比较复杂,门槛也比较高。定制自研固然可以暂时解决企业的问题,但是不具备通用性,也可能有很多潜在的安全风险。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何将OAuth 2.0/JWT与微服务集成的技术,并邀请了拥有丰富实践经验的杨波分享基于OAuth 2.0/JWT的微服务参考架构。文章首先介绍了微服务架构的分层方式,包括Nginx反向代理层、Web应用层、Gateway网关层、BEF层和领域服务层,以及IDP服务。每一层的主要功能和技术选型都有详细的介绍,涵盖了微服务架构的认证授权和服务调用相关流程。此外,文章还提到了ACME公司的业务架构和微服务架构图,以及微服务架构在Kubernetes集群中的运行方式。除此之外,文章还分享了6点补充内容,包括IDP的API支持、单页SPA应用场景、SSO单点登录场景、IDP和网关的部署方式、刷新令牌和Web Session。通过具体的案例和实践经验,为读者提供了一个清晰的微服务架构参考,并指导了如何将OAuth 2.0/JWT与微服务进行集成。整体而言,本文内容涵盖了不同场景下的认证授权流程和服务调用流程,为读者提供了丰富的实际案例,帮助他们理解OAuth 2.0/JWT与微服务集成的原理和应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OAuth 2.0 实战课》
新⼈⾸单¥29
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • 西
    全程使用oauth2令牌,那么网关之后的每个微服务都需要自己根据令牌token去idp或者redis或者mysql中去查询用户信息,如果全程使用jwt令牌,主要是还是由于jwt自包含用户信息,存在暴露用户信息的安全风险。(如果jwt中只存在用户名,不存在其他相关信息也可以考虑全程使用jwt令牌)

    作者回复: 不错⛽️

    2020-07-25
    21
  • 良胜
    王老师,现在我正在搭建一个微服务框架,计划在网关层做集中认证,那网关是否应该时作为OAUTH2的client组建? 另外你画的微服务的架构图,IDP 是作为什么角色?授权服务器还是client,另外Login Svc 又是承担什么工作? 我目前遇到困难,我们期望不管是web侧还是app侧,统一使用token进行认证,并且登录使用手机号+验证码的方式,现在如果访问受限资源,默认会跳到login页面,不是返回json数据,请老师指点

    作者回复: 回复你的一些问题: 1. IDP就是基于OAuth2的授权服务,比方说可以采用Spring Security OAuth2来实现IDP。IDP可以自己实现登录认证的逻辑,也可以把登录认证的逻辑委派给其它服务,比方说独立的Login Service来实现。Spring Security OAuth2的登录认证逻辑就是可以plugin的,可以委派给其它服务来实现。 2. 网关和IDP没有直接的client关系,只是IDP需要支持一些API端点,网关可以通过这些端点来实现:1)令牌校验,2)获取对应的JWT令牌。 3. 登录使用手机号+验证代码,这是一种具体的基于双因素的认证方式,其实OAuth2本身只是要求用户在授权获取令牌前先进行登录认证,具体登录认证的方式它并不关心。Spring Security OAuth2的登录认证方式也是可以plugin的,你可以用默认的用户名密码方式,也可以定制为手机号+验证码方式。实际上Spring Security OAuth2就是基于Spring Security开发的,你只需要定制Spring Security来实现基于手机号+验证码的登录认证方式就可以。

    2020-08-22
    2
    8
  • kylexy_0817
    其实全程使用JWT,也没啥问题,只是如果想其较为安全,就要把公钥放在客户端,让其加密后再传输(或者获取到令牌后就直接加密存放在cookies或localstorage),但JWT的内容较多,即使加密后的内容也会较长,公网环境传输效率不高。而访问令牌,就是为了解决公网传输效率问题。不知有没理解对。

    作者回复: JWT是自包含令牌,里头可以包含一部分用户信息,全程使用JWT也可以,JWT内部的数据本身只是加签防篡改,本来就是客户端可见的,一般服务器端启用HTTPS就可以了,再做一次加密意义并不大。 相比JWT,普通访问令牌机制还有一个好处,就是可以集中吊销令牌,而JWT一般需要等到自然过期,因为它是自校验的。

    2020-08-02
    2
    8
  • 永旭
    老师你好, 查了下BFF相关文章 有些架构图里把BFF放在API 网关层左边, 挨着web层.也有放在API 网关层里边的 能分析分析这两种的有什么优势和劣势 , 区别吗 ?

    作者回复: BFF虽然是前端开发,但是它也是一种聚合API,所以它理应放在API网关后面,这样就可以统一通过网关实现反向路由,限流熔断,日志监控等功能。 所以BFF一般不放在API网关层前面,静态资源一般放在API网关层前面。 也有一些企业的做法是BFF聚合逻辑直接写在网关上的,这种在企业规模不大、BFF逻辑不复杂时也可以采用,可以节省硬件资源。

    2020-11-18
    3
  • 永旭
    老师, 以前我接触的架构图里有DMG层, 会部署前端. 现在课程中 微服务架构图里已经没有了 DMG层了. 要是有的话能部署什么呢 ?

    作者回复: 你说的应该是DMZ非军事区网络吧,在传统数据中心,在外网和内部受信网络之间一般有一个DMZ网络,这里头部署防火墙/反向代理/网关等可以增加各种安全防范措施。参考: https://en.wikipedia.org/wiki/DMZ_(computing) DMZ可以是物理的,也可以是逻辑的,在上文的架构图中,防火墙+Ingress+Gateway也可以算是在DMZ区内,可以增加各种安全措施。

    2020-11-06
    3
  • inrtyx
    第六点是关于 Web Session,这个不太明白。token信息肯定要放浏览器啊!不然岂不是每次请求都要登录?

    作者回复: 网站会话有几种做法,一种是Session数据都存在服务器端,客户端浏览器cookie中只存sesssionID,我把这种称为Web Session,这种是服务器端有状态的Session技术。另外一种是Session数据都存在浏览器cookie中,我把这种称为客户端Session,这种是服务器端无状态的Session技术。

    2020-07-25
    3
    3
  • 往事随风,顺其自然
    全程采用JWt,用户信息容易暴露,对于安全级别高,最好不使用,对于oauth在安全级别更高,但是实现用户信息更复杂,混合之后,权衡了安全性和易用性,个人理解

    作者回复: 不错

    2020-07-25
    2
    3
  • Geek_7c4953
    有一个问题没有理解,APP用password模式登陆和APP上的浏览器打开统一认证页用用户名密码登录,这两者之间在安全层面上有什么区别?

    作者回复: APP用用户名密码模式,通过native界面登录,这是一个一步流程,并且APP上要存clientId+secret,黑客可以破解app获取clientId+secret,然后通过猜测轮训你的post登录接口偷取用户密码。 APP上的浏览器方式走的是一个3-legged完全OAuth2授权码流程,比较安全,很难被黑客利用,而且浏览器方式容易增加验证码和双因素等更安全校验机制。 请参考下文的第7点:Security Consideration https://www.kaper.com/cloud/micro-services-architecture-with-oauth2-and-jwt-part-3-idp/

    2020-11-27
    2
  • Giggle
    请问老师,若只是一个移动端app,想让其实现Oauth协议,提供对其他app的授权登录,这种app的后台Oauth协议的实现是不是不适合使用SpringSecurityOauth这个框架,因为我看框架源码里面授权码模式或者简易模式都是基于浏览器重定向机制实现返回授权码code或者token,用户未授权情况下还会返回相应的授权页面,我是不是可以理解SpringSecurityOauth其实是解决网站和网站的第三方授权的场景,假如我是一个移动端的后台,就不适合使用这个框架。

    作者回复: 移动端原生App也可以采用OAuth2的授权码模式(建议采用支持PKCE的增强型授权码模式),这时候可以在App中以嵌入方式启动手机浏览器,走授权码申请流程,等IDP 返回授权码到 App 浏览器之后,App 可以截取浏览器带回的授权码,然后App可以继续走后面令牌获取的流程。 所以这个流程App需要借助手机上的浏览器这个中介,来走完OAuth2的授权码流程,这个是目前针对原生App采用OAuth2协议的推荐做法。 具体参考本文的[场景 2:第一方移动应用 + 授权码许可模式]的描述。 额外参考: https://auth0.com/blog/oauth-2-best-practices-for-native-apps/ https://auth0.com/docs/flows/authorization-code-flow-with-proof-key-for-code-exchange-pkce

    2020-10-15
    2
  • Tim Zhang
    网关获得 JWT 令牌,校验 Scope 是否有权限调用 API,如果有就转发到后台 API 进行调用。 校验是如何校验的? 并且scope 和 authority有啥区别么

    作者回复: 企业根据具体场景,需要定义一个scope和API之间的权限关系表,这个表需要单独维护,并且可以缓存在网关上,加快网关的校验。所谓校验,就去查这张表,看某个scope能否访问某个API。 scope和authority并没有所谓官方定义,你可以根据上下文赋予它们具体的语义。

    2020-07-27
    2
    2
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部