OAuth2 的基本理解

Oauth2

oauth2 的基本概念

说起基本概念,其实就是是什么,用来做什么,如何用的问题。oauth2 是一个协议,关于授权/安全的协议,主要的作用就是使用者委托第三方去帮自己处理一些关于自己资源的事情,可以这么简单的理解。

关键操作

  • 授权许可:资源拥有者要进行授权
  • 颁发令牌
    • 访问令牌:用来访问受保护的资源
    • 刷新令牌:避免用户重复授权,可使用刷新令牌来更新访问令牌
  • 权限校验:校验是否拥有访问制定资源的权限
    • 授予的权限
    • 客户端注册的权限

许可机制的分类

  • 授权码许可模式
  • 资源拥有者模式
  • 隐式许可模式
  • 客户端许可模式
  • 断言模式

授权码许可

授权码许可用简短的话说,就是资源拥有者授权,授权服务器返回 code,第三方客户端使用 code 换取令牌,第三方客户端使用令牌访问受保护的资源。

角色

  • 资源拥有者:进行授权
  • 第三方客户端:获取令牌并使用令牌
  • 授权服务器:管理注册应用、授权页面生成、颁发令牌、刷新令牌换取访问令牌、权限校验
  • 受保护的资源:校验解析令牌、权限校验

流程

code 模式

细节说明:

  1. 使用 code 换取令牌的时候,uri 中 grant_type 为 authronization_code
  2. 使用 刷新令牌换取访问令牌的时候,uri 中 grant_type 为 refresh_token
  3. 申请授权携带 state 参数,客户端随机生成,防止 csrf 攻击
  4. code 为一次使用,即生成令牌之后,code 即刻失效
  5. 整个流程中,客户端注册的 appId、appSecret、redirectUri 在拿到令牌之前,每一个接口都需要传递的
  6. 接口令牌的传递方式有三种:放在 uri 中、放在 post 请求体中、放在 header 的 authorization 中,官方推荐的是最后一种
  7. 前端信道和后端信道的概念:前端信道是指需要前端,一般指浏览器参与,比如说 code 的申请;后端信道一般不需要浏览器参与,比如说令牌的下发和使用

隐式许可

隐式许可完全就是前端信道了,一般用于浏览器嵌入的场景,也就是客户端嵌入浏览器的场景,比如说 js 等

资源拥有者许可

这个是后端信道了,是使用用户名和密码来换取 token 的,grant_type 为 password

客户端许可

后端信道,也就是第三方客户端自己就是资源的拥有者,场景就是自研应用,grant_type 为 client_credenties,使用的是注册的密钥来换取令牌

断言许可

与客户端类似,只不过断言一般由第三方下发,客户端不知道具体的含义,授权服务器需要解析断言,根据断言内容生成令牌

许可的选择:
许可的选择

oauth2 的接入

  1. 应用的注册以及使用
    1. 注册 appId、appSecret、redirectUri 等
    2. 引导授权
    3. 获取以及使用令牌(注意三种传递方式)
    4. 刷新令牌的使用(注意刷新的时间,可以定时检测,也可以过期刷新)
  2. 权限的范围
    1. 不同的权限对应不同的操作
    2. 不同的权限对应不同的数据
    3. 不同的用户对应不同的数据
  3. 权限的判断
    1. 一般在网关进行权限的校验

JWT

Oauth 协议没有规定令牌的具体格式,所以令牌可以是无意义的字符串,但是字符串必须是唯一的、不连续的、不可预测的,而 JWT 是一种结构化令牌,也就是可以存储信息的令牌生成技术。

结构

header.payload.signature:

  • header 表示令牌类型以及算法等信息
  • payload 就是存储具体的信息
  • signature 对信息签名的结果
    Jwt 的每部分都是经过 BASE64URL编码的,目的是为了让 JWT 在任何环节都不需要做额外的编码处理

特性

无状态,不需要存储,令牌可以解析,因此可以自校验

参考:《OAuth2 实战》

posted @ 2023-02-22 15:19  庄子游世  阅读(95)  评论(0)    收藏  举报