什么是OAuth 2.0?

OAuth 2.0 是一个委托协议,它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源,注意是代表这些人,而不是假冒或模仿这些人。这个应用从资源的所有者那里获得到授权(Authorization)access token(访问令牌),随后就可以使用这个access token来访问资源。
image.png

  • 关于授权Authorization
  • Access Token
  • 支持各种客户端应用

授权和认证

  • OAuth 2.0 授权Authorization
    • 你能干什么
  • OpenId Connect身份认证Authentication
    • 你是谁

OAth 2.0

image.png
资源所有者 (User) -> 用户
客户端引用(Client) -> WPF,Vue,Angular等软件
受保护的资源(Resource) -> 比如Java Spring 开发的API,.NET Core Web API资源

其中资源拥有者拥有受保护的资源的权限,并且他还可以委托其它访问受保护的资源。客户端应用不是浏览器,也不是开发软件的人,在Auth 2.0里面管它叫受保护资源的消费者

授权服务器 Authorization Server

客户端引用和受保护资源之间有一个桥梁,这个桥梁就叫授权服务器。这个授权服务器物理上可以和受保护的资源放在一起,通常是分开的。
image.png

授权服务器做中介流程图

image.png

授权类型Authorization Grant

  • Authorization Code Flow
    • 授权码授权模式 - 通过授权服务器作中介来获取权限,不是从资源拥有者那里直接获取授权。
  • Implicit
    • 简化授权模式 - 能看到access token
  • Rource Owner Password Credentials
    • 密码授权模式 - 当资源拥有者和客户端高度信任的时候并且其它授权方式不可用的时候使用这种授权方式。
    • 一次请求交换access token,通常从授权服务器获得access token和refresh token,当access token过期的时候,通过refresh token再获取access token
  • Client Credentials
    • 客户端授权模式
  • Device Code
  • Refresh Token
  • Other…

IDS4常见授权模式

  • 客户端授权模式(Client Credentials,WPF调用)
  • 密码授权模式(Resource Owner Password Credentials)
  • 授权码授权模式(Authorization Code Flow,MVC调用)
  • 简化授权模式-OpenID(Implicit Flow,JS/Vue客户端调用)
  • 混合模式-OpenID&OAuth(Hybrid Flow,角色+策略授权)
  • 集成ASP.NET Core Identity and EntiryFramework Core

端点 Endpoint

OAuth 2.0里面有两个端点

  • Authorization Endpoint,授权端点
  • Token Endpoint,Token端点

image.png

Scope 范围

代表资源所有者受保护资源那里的一些权限。
把受保护资源分成不同的范围,不同的用户拥有不同权限,就可以访问不同的API。

Access Token

  • 有时候就叫token
  • 用来访问被保护资源的凭据,它是一个字符串组成的
  • 代表了给客户端颁发的授权,也就是委托给客户端的权限
  • 描述出Scope,有效期

Refresh Token

  • 用来获取Access Token的凭据
  • 由Authorization Server颁发给客户端应用的
  • 可选的,一般是要过期或已过期用这个token重新获取新的access token
  • 具备让客户端应用逐渐降低访问权限的能力
    • 一开始scope比较大,通过一些操作后,用户权限变小了。通过refresh token获取到的就是权限变小之后的access token

image.png

发生错误时

  • error 一定会返回的
  • error_description
  • error_url
  • state

image.png

错误的类型

除了invalid_client返回401其它都返回400,当然授权服务器内部发生错误还是会返回500的

  • invalid_request
  • invalid_client(401)
  • invalid_grant
  • unauthorized_client
  • unsupported_grant_type
  • invalid_scope