专栏首页信息安全小学生理解OAuth2.0协议-基础篇

理解OAuth2.0协议-基础篇

什么是OAuth2.0?

https://oauth.net/2/ 说:

OAuth 2.0 is the next evolution of the OAuth protocol which was originally created in late 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This specification is being developed within the IETF OAuth WG.

OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

OAuth2.0 是在 OAuth 基础上的简化与优化,虽然不向下兼容,但是和OAuth 有着相似的理论。

OAuth2.0 的角色

资源所有者 resource owner (RO)

指对某种资源拥有授权能力的实体,如果资源属于某个人的话,这个 RO 就是这个人的终端账户。

资源服务器 resource server (RS)

指某种资源的容器,RS 通过判断 Access Token 是否有效决定资源是否被授权访问。

客户端 client (C)

指需要访问某个用户的受保护资源的客户端程序,既可以是个桌面程序,也可以是个浏览器,也可以是个后台服务。

认证服务端 authorization server (AS)

指颁发 Access Token 给客户端的服务,当然颁发之前要对 RO 进行认证并且由 RO 完成授权。

OAuth2.0 协议流程

从上面的角色可以猜到,OAuth2.0 认证发生在某个资源拥有者希望通过客户端访问其所有资源的时候。 例如:网站 wepass.vip 希望实现微信登录,并获取用户微信的头像,那这时候 wepass.vip 这个网站本身就可以看作是一个 Client,作为拥有微信的我,就是一个资源拥有者(RO),要获取的头像就是我的资源(其实用户名密码本身也属于资源),而 RS(存头像的那个服务器) 和 AS (给认证的那个服务器) 则全部是由腾讯开放平台提供。

所以,当我(RO)想在 wepass.vip (Client) 上看到我的头像(Resource)的时候,我会先访问 wepass.vip,然后 wepass.vip 发现我没登录,就求腾讯(AS)给我验身,然后我在腾讯的认证服务器(AS)上输入我的用户名口令(或者二维码、或者快捷登录),如果腾讯认可我(有时还需要认可Client),就会生成一个 Access Token,wepass.vip 再通过Access Token 去腾讯的资源服务器(RS)上要我的头像,然后再展示给我,这样就完成了一个 OAuth2.0 认证。

这样做的好处是:wepass.vip 不会得到我的用户名密码,但是依然可以相信我的身份,而我也只需要记住自己的微信口令,就可以同时登录 wepass1、wepass2、wepass3 ... 也就是实现了单点登录。

看图(纯手绘):

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

还有一些常见概念

许可类型 Authorization Grant

由于第三方应用(client)的多样性,OAuth2.0提出了多种授权类型:

  • 如授权码 Authorization Code Grant 这种类型 AS 在完成 RO 的认证和授权后,给 Client 一个 Code, Client 带着 Code 再去换 AccessToken,再用 AccessToken 访问资源。
  • 隐式授权 Implicit Grant 这种情况下,RO 认证并授权后,AS 会把 AccessToken 直接交给 Client,而不需要 Client 保存 Authorization Code,再去换取 Access Token。 这种场景适合于没有服务端的程序,也就是没有办法对 Authorization Code 进行保密的 Client 类型。
  • RO凭证授权 Resource Owner Password Credentials Grant 这是一种 RO 对 Client 高度可信的授权方式,RO 要把自己的凭证(用户名、密码)交给 Client,Client 直接拿去向 AS 请求 Access Token。
  • Client凭证授权 Client Credentials Grant 这种场景下 AS 只需要认证 Client,比较适合于待访问资源的安全级别不高或者资源只属于这个 Client 的场景。

访问令牌 Access Token

访问令牌就是为了访问资源用的,一般是字符串形式,里面标注了其范围(Scope)和寿命(Duration)。

续期令牌 Refresh Token

续期令牌就是在当前的访问令牌到期时,为期续期使用的。续期令牌是个可选项,它会和访问令牌一起颁发给Client,只不过续期令牌指在 AS 上使用,不在 RS 上使用。

传输层安全性版本 TLS Version

TLS = Transport Layer Security,如果使用了 TLS,我们就要对其遵循的规范版本进行标注。目前最新的版本号为1.2,最广泛的版本号为1.0。

谁在用 OAuth2.0?

还有HP、IBM、Oracle等等等等,有头有脸有用户的大公司都有自己的 AS 和 RS。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第一个 SpringSecurity 应用

    重点引入 spring-boot-starter-security 依赖项,完整的 gradle 配置如下:

    tonglei0429
  • Python名词解释

    tonglei0429
  • 理解 Viewport

    为了能使我们的网页适应不同设备的屏幕尺寸,通常我们会在CSS使用 media queries 来改变不同规格下的页面样式,对于有的元素,只需要增加 width:...

    tonglei0429
  • Build.VERSION_CODES.HONEYCOMB

    梦_之_旅
  • 发送带附件的邮件

    已经知道了如何通过Python编写发邮件程序,但是想和自动化测试项目结合还需要解决一个问题,因为测试报告的名称是根据当前时间生成的,所以如何找到最新生成的测试报...

    清菡
  • 学习 | Node.js 之定时任务

    这里关于Node.js 使用的是node-schedule定时器。所以这里总体是对node-schedule包的相关的学习。

    mySoul
  • 自学编程能到达培水平嘛?

    很多自学的内心深处肯定都有这样的疑惑,我自学能可以嘛?怎么找到怎么的方向,怎么到达工作的水准,能达到培训人的水平嘛?一系列的疑问,有一点首先要搞清楚,不是每个人...

    程序员互动联盟
  • 计算机存储系统之磁盘阵列技术

    所谓磁盘阵列,它是由多台磁盘存储器组成,是快速、大容量、且高可靠的外存子系统,现在常见的独立冗余磁盘列阵(RAID)就是一种由多块独立磁盘构成的冗余列阵,

    灰小猿
  • PyTorch 1.0 正式版发布了!

    作者:ZACH DEVITO、YANGQING JIA、DMYTRO DZHULGAKOV、SOUMITH CHINTALA、JOSEPH SPISAK

    机器之心
  • 闯红灯到底该不该罚款?——逻辑推理浅谈(二)

    我们当然期待完美的演绎推理式逻辑,这样我们说的每句话和每个行动都有的放矢。而缺陷却是我们的推理寸步难行,因为要找到绝对正确的大前提和小前提是不可能的,顶多在一定...

    magic2728

扫码关注云+社区

领取腾讯云代金券