OAuth2 简介

OAuth 是一种授权框架,用来让用户允许第三方应用访问他的账户资源的一种授权框架,例如很多网站提供的 QQ/微信/微博登录,即使该网站和腾讯微博并没有什么关系。

OAuth 定义了四个角色:

  1. Resource Owner:资源所有者,也就是用户
  2. Client:客户端,例如你想要使用 QQ 登录博客园网站,那么博客园就是 Client
  3. Resource Server:资源服务器,例如 QQ 服务器
  4. Authorization Server:授权服务器,例如 QQ 服务器

对于开发者来说通常 Resource Server 和 Authorization Server 是绑定在一起的。

OAuth 的简化抽象授权流程如下图所示:

应用向用户请求授权,当授权被同意以后,应用请求并获取令牌,然后通过令牌向资源服务器请求服务。

同时应用在使用 OAuth 之前,需要向授权服务器注册并至少提供应用名,应用站点和回调 URL 等信息。在注册完成以后,授权服务将提供 client identifier 和 client secret 来标识和证明应用的身份,client identifier 是公开的,但是 client secret 是机密。

OAuth2 定义了三种主要的授权方式:

  1. Authorization Code
  2. Client Credentials
  3. Device Code

Authorization Code

Authorization Code 是应用最多的,适用于服务端应用程序,也就是各种网站站点。具体流程如下

首先进入授权页面,例如

/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

然后在该页面完成授权,例如

然后跳转到你的应用注册的回调 URL,并且携带上 Authorization Code,此时 Redirect 的 URL 类似这样

https://cnblogs.com/callback?code=AUTHORIZATION_CODE

那么此时你已经获得了授权码,此时向授权服务器请求 Token,当获得到 Token 以后就可以向资源服务器请求资源。

Client Credentials

Client Credentials 直接向授权服务器发送证书,请求 Token,例如 Post 发送 URL https://oauth.example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

Device Code

适用于没有浏览器或者输入方式受限的设备,实际可见二维码登录等。

机器首先 Post 发送 device code 授权请求(同时携带 Client ID),然后授权服务器可能返回一个如下的响应

{
"device_code": "IO2RUI3SAH0IQuESHAEBAeYOO8UPAI",
"user_code": "RSIK-KRAM",
"verification_uri": "https://example.okta.com/device",
"interval": 10,
"expires_in": 1600
}

其中 device_code 可能是类似的一串代码,又或者是一个 URL 或者是一个二维码。

  1. 如果是一串代码,用户方法在指定的 URL 输入这串代码
  2. 如果是一个 URL,用户访问这个 URL
  3. 如果是一个二维码,用户扫描这个二维码

然后应用轮询这个 verification_uri,知道返回错误或者返回 Token。

posted @   秦晓  阅读(160)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示