01

集成介绍

在上一篇文章《 Authing Share|Spring Security 集成 OAuth 2.0 认证(一)》(以下简称《认证(一)》)中我们讲解了很多的基础知识和概念,包括 OAuth 2.0 概述、协议特点、应用场景以及该协议中几种角色和实体的定义。

同时,认证(一)也着重讲解了四种授权类型中的授权码模式,从客户端访问开始,一直到验证授权码和 URI,确认无误后,向客户端发放令牌的整个流程。篇末也介绍了 OAuth 2.0 刷新令牌的机制。

相信认证(一)已经让大家对 OAuth 2.0 有了一定的了解,接下来,本文将继续讲解 OAuth 2.0 的其他几种授权类型。

02

知识储备学习

授权类型

密码凭证模式(Resource Owner Password Credentials)

用户必须向客户端提供用户名和密码,存在较大的风险。通常只有在认证服务器无法通过其他方式进行授权时,才会考虑使用此种模式。

(A) 用户向客户端提供用户名和密码凭证。

(B) 客户端将用户名和密码凭证发送给认证服务器,并请求令牌。

  • grant_type:表示授权类型,必选项,此种模式固定为 “password”
  • username:表示用户名,必选项
  • password:表示密码,必选项
  • scope:表示权限范围,可选项

实例:

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 
grant_type=password&username=authing&password=authing

© 认证服务器确认无误后,向客户端发放令牌

客户端凭证模式(Client Credentials)

由客户端直接向服务提供商进行认证,其实并不存在授权问题。

(A) 客户端向认证服务器提供身份凭证,并请求令牌

  • grant_type:表示授权类型,必选项,此种模式固定为 “client_credentials”
  • scope:表示权限范围,可选项

实例:

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 
grant_type=client_credentials

(B) 认证服务器确认无误后,向客户端发放令牌

简化模式(Implicit)

不通过第三方应用的服务器,直接在浏览器中进行,不需要使用授权码。

(A) 用户通过用户代理访问客户端,客户端将其重定向到认证服务器

  • response_type:表示授权类型,必选项,此种模式固定为 “token”
  • client_id:表示客户端 ID,必选项
  • redirect_uri:表示重定向 URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端当前状态,可选项

实例:

GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb 
HTTP/1.1 Host: server.example.com

(B) 用户选择是否授权给客户端

© 如果用户授权,认证服务器将用户重定向到客户端事先指定的 URI,并在 URI 的 Hash 部分包含访问令牌:

  • access_token:表示访问令牌,必选项
  • token_type:表示令牌类型,必选项
  • expires_in:表示过期时间,单位为秒。如果省略,则其他方式必须设置
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的状态

实例:

HTTP/1.1 302 Found 
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA 
          &state=xyz&token_type=example&expires_in=3600

(D) 浏览器向资源服务器发送请求,但不包含 Hash 值

(E)资源服务器返回一个网页,包含获取 Hash 值中令牌的代码

(F) 浏览器执行脚本,获取令牌

(G) 浏览器将令牌发送给客户端

授权过程参数

值得注意的是,不管我们使用哪一种授权方式,在三方应用申请令牌之前,都必须在系统中去申请身份唯一标识:客户端 ID(client ID)和 客户端密钥(client secret),这样做可以保证 token 不被恶意使用。

OAuth 2.0 授权过程中几个重要的参数:

  • response_type:code 表示要求返回授权码,token 表示直接返回令牌
  • client_id:客户端身份标识
  • client_secret:客户端密钥
  • redirect_uri:重定向地址
  • scope:表示授权的范围,read只读权限,all读写权限
  • grant_type:表示授权的方式,AUTHORIZATION_CODE(授权码)、password(密码)、client_credentials(凭证式)、refresh_token 更新令牌
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

总结

OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,授予应用对 API 的访问权限(delegate access to APIs)。

OAuth 设定了对于 API 访问的 scope 的权限,以及支持多种授权方式,以及使用场景。OAuth 提供了更好的安全性以及便利,简化了软件系统的复杂性。

关于 Authing

Authing 是国内首款以开发者为中心的全场景身份云产品,为企业和开发者提供完善安全的用户认证和访问管理服务。作为云原生架构下的身份云产品,Authing 在产品创建初期,目标就是服务亿级的企业和个人开发者客户,轻量级、易部署、低消耗、技术栈成熟,运维易的云原生技术产品架构,成为了 Authing 的首选。

点击此处了解更多行业身份管理

「解决方案」以及「最佳实践案例」

Logo

Authing 是一款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务

更多推荐