JustAuth/docs/oauth.md

3.8 KiB
Raw Blame History

关于OAuth

请先查阅以下资料:

OAuth 2 的授权流程

参与的角色

  • Resource Owner 资源所有者即代表授权客户端访问本身资源信息的用户User也就是应用场景中的“开发者A
  • Resource Server 资源服务器,托管受保护的用户账号信息比如Github
  • Authorization Server 授权服务器,验证用户身份然后为客户端派发资源访问令牌比如Github
    • Resource ServerAuthorization Server 可以是同一台服务器,也可以是不同的服务器,视具体的授权平台而有所差异
  • Client 客户端,即代表意图访问受限资源的第三方应用

授权流程

     +--------+                               +---------------+
     |        |--(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 ---|               |
     +--------+                               +---------------+

上面的流程图取自The OAuth 2.0 Authorization Framework#1.2

流程解析

  • (A) 用户打开客户端以后,客户端要求用户给予授权。
  • (B) 用户同意给予客户端授权。
  • (C) 客户端使用上一步获得的授权,向认证服务器申请令牌。
  • (D) 认证服务器客户端进行认证以后,确认无误,同意发放令牌
  • (E) 客户端使用令牌,向资源服务器申请获取资源。
  • (F) 资源服务器确认令牌无误,同意向客户端开放资源。

授权许可 Authorization Grant

  • Authorization Code
    • 结合普通服务器端应用使用(web端常用的授权方式)
  • Implicit
    • 结合移动应用或 Web App 使用
  • Resource Owner Password Credentials
    • 适用于受信任客户端应用,例如同个组织的内部或外部应用
  • Client Credentials
    • 适用于客户端调用主服务API型应用比如百度API Store

直白话 OAuth 2 流程

以上流程理解起来可能有些难度,这儿我们给出一个白话版的流程图

这儿引入三个角色:

  • 用户A可以理解成你自己
  • 网站B可以理解成 Oschina
  • 第三方C可以理解成 Github

需求你想通过Github第三方登录Oschina。注:下面的内容为流程图,如果您在阅读的时候显示为纯文字,请刷新页面

sequenceDiagram 用户A->>网站B: 1.我想登录你 网站B->>用户A: 2.我不认识你 用户A->>第三方C: 3.老铁我去过你那儿咱俩认识你帮我授权给网站B 第三方C->>网站B: 4.用户A是我老铁给你他的授权码 网站B->>第三方C: 5.这个授权码是你那儿的人吗?是的话给我他的令牌 第三方C->>网站B: 6.是我这儿的人,让他登录吧 网站B->>用户A: 7.得嘞,您走着 用户A->>网站B: 8.登录成功