前端该了解的oauth2【三】

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

密码式

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

实现流程
  1. 第一步,A 网站要求用户提供 B 网站的用户名和密码。拿到以后,A 就直接向 B 请求令牌。

    https://oauth.b.com/token?
      grant_type=password&
      username=USERNAME&
      password=PASSWORD&
      client_id=CLIENT_ID
    复制代码
    • grant_type = password 授权方式为密码的形式进行授权
    • username && userpassword B网站的登录用户名及密码
    • client_id 用户申请令牌的身份标识
  2. B 网站验证身份通过后,直接给出令牌。注意,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

    这种方式需要用户给出自己的用户名/密码,显然风险很大,因此只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应


凭证式

凭证式和密码式很相似,主要适用于那些没有前端的命令行应用,可以用最简单的方式获取令牌,在请求响应的 JSON 结果中返回 token

实现流程
  1. 第一步,A 应用在命令行向 B 发出请求。
https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
复制代码

grant_typeclient_credentials 表示凭证式授权,client_idclient_secret 用来识别身份。

  1. B 网站验证通过以后,直接返回令牌。

令牌的使用/更新

使用

A 网站拿到令牌以后,就可以向 B 网站的 API 请求数据了。使用方法为在请求头中将 token 放在 http 请求头部的一个Authorization字段里。

更新

token是有时效性的,一旦过期就需要重新获取,令牌的有效期到了,如果让用户重新走一遍上面的流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌

实现方法

具体方法是,B 网站颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据,另一个用于获取新的令牌(refresh token 字段)。令牌到期前,用户使用 refresh token 发一个请求,去更新令牌。

https://b.com/oauth/token?
  grant_type=refresh_token&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET&
  refresh_token=REFRESH_TOKEN
复制代码

grant_type参数为refresh_token表示要求更新令牌;

client_id参数和client_secret参数用于确认身份;

refresh_token参数就是用于更新令牌的令牌。

B 网站验证通过以后,就会颁发新的令牌

猜你喜欢

转载自juejin.im/post/7034824162027765774