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

03 | 授权服务:授权码和访问令牌的颁发流程是怎样的?

你好,我是王新栋。
在上一讲,我从为什么需要授权码这个问题开始,为你串了一遍授权码许可流程整体的通信过程。在接下来的三讲中,我会着重为你讲解关于授权服务的工作流程、授权过程中的令牌,以及如何接入 OAuth 2.0。这样一来,你就可以吃透授权码许可这一最经典、最完备、最常用的授权流程了,以后再处理授权相关的逻辑就更得心应手了。现在呢,让我们开始这一讲。
在介绍授权码许可类型时,我提到了很多次 “授权服务”。一句话概括,授权服务就是负责颁发访问令牌的服务。更进一步地讲,OAuth 2.0 的核心是授权服务,而授权服务的核心就是令牌。
为什么这么说呢?当第三方软件比如小兔,要想获取小明在京东店铺的订单,就必须先从京东商家开放平台的授权服务那里获取访问令牌,进而通过访问令牌来 “代表” 小明去请求小明的订单数据。这不恰恰就是整个 OAuth 2.0 授权体系的核心吗?
那么,授权服务到底是怎么生成访问令牌的,这其中包含了哪些操作呢?还有一个问题是,访问令牌过期了而用户又不在场的情况下,又如何重新生成访问令牌呢?
带着这两个问题,我们就以授权码许可类型为例,一起深入探索下授权服务这个核心组件吧。

授权服务的工作过程

开始之前,你还是要先回想下小明给小兔软件授权订单数据的整个流程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OAuth 2.0授权服务的核心在于颁发授权码和访问令牌,涉及第三方软件注册、请求访问范围、授权码和访问令牌的关键操作。在颁发授权码过程中,授权服务进行了准备工作,包括验证基本信息、权限范围和生成授权请求页面。经过用户授权后,授权服务验证权限范围、处理授权请求生成授权码,并重定向至第三方软件。这一过程强调了对权限范围的重视和合法性校验,以及授权码的临时性和有效期。整个流程突出了OAuth 2.0的安全性和权限控制特点。 在颁发访问令牌过程中,授权服务验证第三方软件是否存在,验证授权码的合法性,并生成访问令牌。访问令牌的生成需要符合唯一性、不连续性和不可猜性的原则,通常使用UUID来实现。访问令牌还需要与第三方软件的应用标识和资源拥有者标识进行关系映射,并设置过期时间。文章还介绍了结构化令牌(JWT)的概念。 刷新令牌的颁发和使用与访问令牌类似,但刷新令牌的存在是为了在访问令牌失效时,通过系统重新请求生成一个新的访问令牌,避免用户频繁手动授权。刷新令牌和访问令牌一起生成,并在使用时需要验证基本信息并重新生成访问令牌。 总之,本文详细介绍了OAuth 2.0授权服务的核心流程,包括授权码和访问令牌的颁发,以及刷新令牌的概念和使用。读者通过阅读本文可以快速了解OAuth 2.0授权服务的技术特点和流程,为理解授权流程代码和搭建授权服务提供了清晰的指导。OAuth 2.0的安全性和权限控制特点得到了充分展现,为读者提供了深入理解和应用该技术的基础。

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

全部留言(80)

  • 最新
  • 精选
  • 约书亚
    在上一节回答留言时,老师提到,用refresh刷新access时,如果access没过期,那会给这个access续期而不会重新生成? 这节课没提到这个。请问这是oauth规定的么?或者一般都这样实现? 因为我感觉无限续期会增加access被破解的风险

    作者回复: 感谢 约书亚 指正 我翻看了 之前的回复 做了修改。 1、:若access_token未超时,那么进行refresh_token有两种方式,(1)不会改变access_token,但超时时间会刷新,相当于续期access_token(2)更新access_token的值,我们建议【统一更新access_token的值】。 2、延期access_token并不是一个最好的方式,尽管有的开放平台是这么做的。 3、在我们这节课中,我们是提到了这点,本文中的描述是:【用来通过系统重新请求生成一个新的访问令牌】 而且咱们这节课的建议也是更换一个新的访问令牌。 4、“因为我感觉无限续期会增加access被破解的风险” 刷新令牌也有有效期。

    2020-07-05
    3
    14
  • 申玉宝
    为什么要 通过刷新令牌让第三方不断刷新token有效期,而不是直接给访问token一个更长的有效期?后者更简单

    作者回复: 为了安全性的考虑,是不可以让“token一个更长的有效期”存在的。

    2020-07-05
    12
    9
  • 哈德韦
    请问什么是 rscope?和上下文中的 scope 是一回事吗?这个 r 代表什么?

    作者回复: 对应的权限 都是同一个权限,这里用rscope是受保护资源服务再次确认的权限,r是replay。

    2020-07-05
    2
    7
  • 永旭
    当第三方软件的访问令牌过期, 触发了刷新令牌的刷新, 从新生成访问令牌和刷新令牌, 这是过期时间又被重置. 如此循环是不是说, 永远不会过期啊 ??

    作者回复: refresh_token过期时间不会重新刷新

    2020-11-09
    4
    6
  • Harvey
    既然第三方软件需要先在授权服务上注册,那为什么不在注册时直接把回调地址也注册了,这样不是更安全?

    作者回复: 第三方应用在平台上面注册的时候,包含回调地址。

    2020-07-06
    8
    5
  • Ryan Pan
    请问为什麽刷新令牌用过了一定要废除呢? 有过期时间的话其实也可以用同一个来产生访问令牌不是吗? 还有想问一般来说刷新令牌的期限会设多久呢?

    作者回复: 当刷新令牌被使用过,授权服务可以自行决定是否颁发新的刷新令牌来替换旧的,我们的建议是生成新的。 refresh_token 的有效期具体多长时间,同样在OAuth 2.0 规范里面并没有给出确定值,一般比 access_token 的有效期长1-7天。

    2020-07-05
    5
  • AA
    淘宝的refresh_token也有过期时间,通过refresh_token刷新后,返回来assessToken和refresh_token,但refresh_token过期时间不会重新刷新,这是为什么要这样设置呢,当refresh_token为0时,是不是只能通过重新登录授权

    作者回复: 是的,当刷新令牌也过期了,只能重新登录再授权。

    2020-07-04
    6
    5
  • 暖色浮余生
    刷新令牌有过期时间吧,不过一般设置的时间比较长。反正微信公众号的挺长的,还有一直不明白 scope的 权限范围指的是一个什么样的范围

    作者回复: SCOPE的权限范围非常重要,OAuth 2.0 本着【最小权限范围】原则,来支持用户对第三方软件授权。比如小兔打单软件,他的主要“行当”就是帮助小明打印订单,那么它的权限范围就是调用跟订单打印相关的API,比如单条查询订单API、批量查询订单API,那么查询小明店铺其它的API就要受限,在小兔打单软件申请成为开放平台的应用的时候就要做一次权限范围的选择,另外,当小明给小兔进行授权的时候,也会让小明去选择并确认,总之就是不要让小兔打单软件有超过其正常权限的范围,来充分保护小明店铺的数据。后面的课程,我们还会详细讲解关于SCOPE的种类和用法。

    2020-07-04
    2
    5
  • 唐朝农民
    String appStr = refreshTokenMap.get("refresh_token"); if(!appStr.startsWith(appId+"|"+"USERTEST")){//该refresh_token值 不是颁发给该 第三方软件的 return; } 有一点不是很明白,授权服务是一个平台,不可能针对“小明”一个用户,那么在验证refresh_token时肯定不能硬编码成“USERTEST”,而是从上下文中获取的,请求这个用户ID 是 怎么传递的呢?

    作者回复: 在实际生产环境中,这个用户ID是不需要传递的也不可能被传递,因为OAuth 2.0的目的之一就是不让第三方软件接触到用户ID。 第一次跟用户ID有关系的时候就是在用户给第三方软件授权的时候,这个时候如果用户没有登录就会先登录再授权,这一切都是发生在平台的一方,所以平台能够拿到用户的ID,继而在给第三方软件生成访问令牌的时候,就可以让这个访问令牌access_token的值跟第三方软件的app_id和用户ID做一个映射关系,同理refresh_token的生成也是一样的,并且refresh_token和access_token是一起生成并返回给第三方软件。 我们在代码中为了演示refresh_token和access_token的生成都是在app_id和用户这个粒度的,是“特意”固定写死了一个USERTEST值。

    2020-07-12
    3
  • 马成
    刷新令牌和授权码的处理机制感觉非常相似。只是code是第一次生成的,刷新令牌是后续生成的,功能都是换取访问令牌。我觉得这里还有一个点没说,就是在访问令牌有效期的前半段时间,使用刷新令牌换取的访问令牌是不变的。想问一下设计上可不可使用访问令牌来换取新的访问令牌?

    作者回复: 1.刷新令牌和授权码完全两个东西 2.刷新令牌换回来的访问令牌一定是变的 3.不可以,有2所以3不成立 对于第2点,可能是马成看了上节课的留言回复,当时有不准确的描述,我已修改,最好的方案是:更新访问令牌的值,这也是咱们这节课给出的建议【用来通过系统重新请求生成一个新的访问令牌】。 “若access_token未超时,那么进行refresh_token有两种方式,(1)不改变access_token,但超时时间会刷新,相当于续期access_token(2)更新access_token的值,我们建议【统一更新access_token的值】”

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