授权机制OAuth2.0

简介: 授权机制OAuth2.0

概念

OAuth2.0标准- RFC6749文件定义了OAuth机制:

OAuth2.0 是一种授权机制。系统产生一个临时令牌(token),授权第三方应用进入系统,从而在不告知密码情况下可以获取到系统数据。

角色

  • Resource Owner:资源所有者,这里可以理解为用户
  • Client:客户端,可以理解为一个第三方的应用程序
  • Resource Server:资源服务器,它存储用户或其它资源
  • Authorization Server:授权服务器,它认证resource owner的身份,为 resource owner提供授权审批流程,并最终颁发授权令牌(Access Token)

Tips:authorization server与resource server的功能可以由同一个服务器来提供服务。

四种授权方式

1.授权码(Authorization Code)

原理

第三方应用先申请一个授权码,然后再用该码获取令牌。这种方法安全性高,适用范围比较广。

网络异常,图片无法展示
|

适用场景

适用于有后端的 Web 应用,即前后端分离开发模式。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成,这样可以避免令牌泄漏。

步骤

step1-请求授权码,并指定授权范围以及重定向url

A 网站提供一个链接,用户点击后就会跳转到 B 网站,授权用户数据给 A 网站使用。下面就是 A 网站跳转 B 网站的一个示意链接:

https://b.com/oauth/authorize?
  response_type=code&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
复制代码
  • response_type=code表示要求后端返回授权码code
  • client_id用于后端识别当前是谁在请求
  • redirect_uri表示重定向url,B 接受或拒绝请求后的跳转网址
  • scope表示要求的授权范围,read-只读

step2-返回授权码,并在重定向url上添加授权码

用户跳转到B 网站后,B网站会要求用户登录,然后询问是否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时,会传回一个授权码:

https://a.com/callback?code=AUTHORIZATION_CODE
复制代码
  • code参数就是授权码

step3-请求令牌

A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌。

https://b.com/oauth/token?
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET&
  grant_type=authorization_code&
  code=AUTHORIZATION_CODE&
  redirect_uri=CALLBACK_URL
复制代码
  • client_id参数和client_secret参数用来让 B 确认 A 的身份(client_secret参数是保密的,因此只能在后端发请求)
  • grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码
  • code参数是上一步拿到的授权码
  • redirect_uri参数是令牌颁发后的回调网址

step4-返回令牌

B 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 JSON 数据:

{    
   "access_token":"ACCESS_TOKEN",
   "token_type":"bearer",
   "expires_in":2592000,
   "refresh_token":"REFRESH_TOKEN",
   "scope":"read",
   "uid":100101,
   "info":{...}
 }
复制代码

上面 JSON 数据中,access_token字段就是令牌,A 网站在后端拿到了。

2.隐藏式(Implicit Grant)

原理

允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。

网络异常,图片无法展示
|

适用场景

适用于纯前端应用,没有后端,将令牌直接储存在前端。这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。

步骤

step1-请求令牌

A 网站提供一个链接,要求用户跳转到 B 网站,授权用户数据给 A 网站使用。

https://b.com/oauth/authorize?
   response_type=token&
   client_id=CLIENT_ID&
   redirect_uri=CALLBACK_URL&
   scope=read
复制代码
  • response_type参数为token,表示要求直接返回令牌。

step2-返回令牌

用户跳转到 B 网站,登录后同意给予 A 网站授权。这时,B 网站就会跳回redirect_uri参数指定的跳转网址,并且把令牌作为 URL 参数,传给 A 网站。

https://a.com/callback#token=ACCESS_TOKEN
复制代码
  • token参数就是令牌,A 网站因此直接在前端拿到令牌。

注意:令牌的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。

3.密码式(Resource Owner Password Credentials)

原理

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

适用场景

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

步骤

step1-给出用户名和密码,请求令牌

A 网站要求用户提供 B 网站的用户名和密码。拿到以后,A 就直接向 B 请求令牌。

https://oauth.b.com/token?
   grant_type=password&
   username=USERNAME&
   password=PASSWORD&
   client_id=CLIENT_ID
复制代码
  • grant_type参数是授权方式,password表示"密码式"
  • usernamepassword是 B 的用户名和密码

step2-验证身份,返回令牌

B 网站验证身份通过后,直接给出令牌。注意,这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。

4.凭证式(Client Credentials)

适用场景

适用于没有前端的命令行应用,即在命令行下请求令牌。这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

步骤

step1

第一步,A 应用在命令行向 B 发出请求。

https://oauth.b.com/token?
   grant_type=client_credentials&
   client_id=CLIENT_ID&
   client_secret=CLIENT_SECRET
复制代码
  • grant_type参数等于client_credentials表示采用凭证式
  • client_idclient_secret用来让 B 确认 A 的身份

step2

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

拿到令牌后如何使用

通过上述授权方式拿到令牌(access_token)之后,在请求API地址后面加上access_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 网站验证通过以后,就会颁发新的令牌。



相关文章
|
1月前
|
存储 安全 数据安全/隐私保护
OAuth 2.0 的授权机制
【10月更文挑战第5天】
32 2
|
4月前
|
存储 Java Maven
使用Java实现OAuth 2.0认证授权
使用Java实现OAuth 2.0认证授权
|
3月前
|
存储 安全 数据安全/隐私保护
SSO 单点登录与 OAuth2.0 的技术区别与应用
【8月更文挑战第24天】在现代软件开发和企业信息化建设中,身份认证与授权是不可或缺的一环。SSO(Single Sign-On,单点登录)和OAuth 2.0作为两种重要的身份认证与授权机制,各自具有独特的特点和应用场景。本文将详细探讨这两种机制的区别,并分享在工作学习中的技术干货。
151 0
|
4月前
|
安全 前端开发 Java
实现基于OAuth2的安全认证与授权
实现基于OAuth2的安全认证与授权
|
5月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
508 0
Jasny SSO是否支持OAuth认证?底层原理是什么?
Jasny SSO是否支持OAuth认证?底层原理是什么?
|
XML 安全 C++
认证与授权——单点登录协议盘点:OpenID vs OAuth2 vs SAML
无论是Web端还是移动端,现在第三方应用账户登录已经成为了标配,任意打开个网站都可以看到,QQ/微信账号登录的字样。使用第三方账户的登录的过程,既要限制用户身份只让有效注册用户才能登录,还要根据注册用户的不同身份来控制能浏览的内容,这就需要认证和授权 相关文章链接: OAuth2.
2219 0
|
存储 安全 前端开发
OIDC SSO - OAuth2.0的授权模式选择
## 背景信息 > OIDC SSO相关文档总共4篇,主要内容为对OIDC实现SSO登录流程时的各个细节和相关技术的阐述:1. 《OIDC SSO - OAuth2.0的授权模式选择》 2. 《[OIDC SSO - 相关SSO流程和注意事项](https://ata.alibaba-inc.com/articles/218495)》 3. 《[OIDC SSO - Discovery Mech
1094 0
OIDC SSO - OAuth2.0的授权模式选择
|
安全 数据安全/隐私保护
OAuth 2.0授权框架详解
OAuth 2.0授权框架详解
OAuth 2.0授权框架详解
|
XML JSON 安全
SAML和OAuth2这两种SSO协议的区别
SAML和OAuth2这两种SSO协议的区别
SAML和OAuth2这两种SSO协议的区别