OAuth2.0 授权的四种方式

四种方式:

  • 授权码模式(grant_type--->authorization_code
  • 简化模式(response_type--->token
  • 密码模式(grant_type--->password
  • 客户端模式(grant_type--->client_credentials

适用场景

  • 授权码模式:安全性高,使用率高,流程复杂。要求第三方应用必须有服务器。对安全性要求较高,web项目中一般使用授权码模式。
  • 简化模式:流程简单;适用于纯前端应用,不安全。Token有效期短,浏览器关闭即失效
  • 密码模式:需要输入账号密码,极度不安全,需要高度信任第三方应用适用于其他授权模式都无法采用的情况;原生APP可以使用,web不建议使用
  • 客户端模式:授权维度为应用维度,而不是用户维度。因此有可能多个用户共用一个Token的情况。适用于应用维度的共享资源。适用于服务器之间交互,不需要用户参与。

一、授权码模式

1、授权码模式介绍

(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:
  Get请求:
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=code&scope=ROLE_ADMIN&redirect_uri=http://www.baidu.com
参数列表如下:
  • client_id:客户端准入标识。
  • response_type:授权码模式固定为code。
  • scope:客户端权限。
  • redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。
(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。
(3)授权服务器将授权码(AuthorizationCode)转经浏览器发送给client(通过redirect_uri)
(4)客户端拿着授权码向授权服务器索要访问access_token,请求如下: 
  Post请求:
localhost:53020/uaa/oauth/token
参数列表如下
  • client_id:客户端准入标识。
  • client_secret:客户端秘钥。
  • grant_type:授权类型,填写authorization_code,表示授权码模式
  • code:授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请。
  • redirect_uri:申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致。

请求示例:grant_type--->authorization_code

响应成功示例:

(5)授权服务器返回令牌(access_token)
  这种模式是四种模式中最安全的一种模式。一般用于client是Web服务器端应用或第三方的原生App调用资源服务
的时候。因为在这种模式中access_token不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大
限度的减小了令牌泄漏的风险。 

二、简化模式 

(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:
  Get请求:response_type--->token
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=token&scope=all&redirect_uri=http://www.baidu.com
  参数描述同授权码模式 ,注意response_type=token,说明是简化模式。
(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。
(3)授权服务器将授权码将令牌(access_token)以Hash的形式存放在重定向uri的fargment中发送给浏览器。
响应成功示例:

三、密码模式 

(1)资源拥有者将用户名、密码发送给客户端
(2)客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token),请求如下:
  Post请求:
localhost:53010/uaa/oauth/token
参数列表如下:
  • client_id:客户端准入标识。
  • client_secret:客户端秘钥。
  • grant_type:授权类型,填写password表示密码模式
  • username:资源拥有者用户名。
  • password:资源拥有者密码。
(3)授权服务器将令牌(access_token)发送给client
  这种模式十分简单,但是却意味着直接将用户敏感信息泄漏给了client,因此这就说明这种模式只能用于client是我们自己开发的情况下。因此密码模式一般用于我们自己开发的,第一方原生App或第一方单页面应用。
请求示例:grant_type--->password

 响应成功示例:

四、客户端模式

(1)客户端向授权服务器发送自己的身份信息,并请求令牌(access_token)
(2)确认客户端身份无误后,将令牌(access_token)发送给client,请求如下: 
  Post请求
localhost:53020/uaa/oauth/token
参数列表如下:
  • client_id:客户端准入标识。
  • client_secret:客户端秘钥。
  • grant_type:授权类型,填写client_credentials表示客户端模式
这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任,而client本身也是安全的。因此这种模式一般用来提供给我们完全信任的服务器端服务。比如,合作方系统对接,拉取一组用户信息。

请求示例:grant_type--->client_credentials

响应成功示例:

 

 

 

 
posted @ 2021-03-12 16:35  donleo123  阅读(2144)  评论(0编辑  收藏  举报