OAuth2中四種授權模式以及相應操作


介紹:

spring-security+spring-security-oauth2,實現Oauth2的四種授權方式

例子地址:https://gitee.com/Dimple1130/springstudy

用到的工具:

IDEA,Postman

使用到的技術框架依賴

spring security,springboot

先介紹一下四種授權模式:

客戶端必須得到用戶的授權(authorization grant),才能獲得令牌(access token)。OAuth 2.0
於如何頒發令牌的細節,規定得非常詳細。具體來說,一共分成四種授權類型(authorization
grant),即四種頒發令牌的方式,適用於不同的互聯網場景

  1. 授權碼模式(authorization code)(認證級別最高的。可以聯想到微信掃碼登錄京東的場景)
  2. 密碼模式(resource owner password credentials
  3. 簡化(隱式)模式(implicit
  4. 客戶端模式(client credentials

1、授權碼模式:

A)用戶訪問客戶端,后者將前者導向授權服務器。
B)用戶選擇是否給予客戶端授權。
C)假設用戶給予授權,授權服務器將用戶導向客戶端事先指定的"重定向URI"redirection
URI),同時附上一個授權碼。
D)客戶端收到授權碼,附上早先的"重定向URI",向授權服務器申請令牌。這一步是在客戶端
的后台的服務器上完成的,對用戶不可見。
E)授權服務器核對了授權碼和重定向URI,確認無誤后,向客戶端發送訪問令牌(access
token)和更新令牌(refresh token)。
2、簡化模式

簡化模式不通過第三方應用程序的服務器,直接在瀏覽器中向授權服務器申請令牌,跳過了"授權碼"
個步驟,所有步驟在瀏覽器中完成,令牌對訪問者是可見的,且客戶端不需要認證。
這種方式把令牌直接傳給前端,是很不安全的。因此,只能用於一些安全要求不高的場景,並且令牌的
有效期必須非常短,通常就是會話期間(session)有效,瀏覽器關掉,令牌就失效了。
3、密碼模式

如果你高度信任某個應用,RFC 6749 也允許用戶把用戶名和密碼,直接告訴該應用。該應用就使用你
的密碼,申請令牌,這種方式稱為"密碼式"password)。
在這種模式中,用戶必須把自己的密碼給客戶端,但是客戶端不得儲存密碼。這通常用在用戶對客戶端
高度信任的情況下,比如客戶端是操作系統的一部分,或者由一個著名公司出品。而授權服務器只有在
其他授權模式無法執行的情況下,才能考慮使用這種模式

 

4、客戶端模式

客戶端模式(Client Credentials Grant)指客戶端以自己的名義,而不是以用戶的名義,向"服務提供
"進行授權。
適用於沒有前端的命令行應用,即在命令行下請求令牌。一般用來提供給我們完全信任的服務器端服
務。


相關獲取驗證操作的步驟、獲取URL以及需要添加的配置如下

一、授權碼模式      
獲取授權碼
http://localhost:8080/oauth/authorize?
response_type=code
&client_id=client
&redirect_uri=http://www.baidu.com
&scope=all
  在認證身份之后,瀏覽器返回授權碼:GVtroX
獲取token(postman)
http://localhost:8080/oauth/token
  authorization:
    選擇Basic Auth
    Username:client
    Password:123123
body:
grant_type:authorization_code
code:GVtroX
redirect_uri:http://www.baidu.com

 

 

 

 

 

 

 

 

2、簡化模式

簡化模式:
authorizedGrantTypes添加一個implicit類型
http://localhost:8080/oauth/authorize?
&response_type=token
&client_id=client
&redirect_uri=http://www.baidu.com
&scope=all

返回結果為:https://www.baidu.com/#access_token=ff1888bf-97d7-4586-8035-606ab0966bee&token_type=bearer&expires_in=3599
帶了一個access_token的錨點


 

 

 

 

 

3、密碼模式

http://localhost:8080/oauth/token?
username=allen
&password=123456
&grant_type=password
&client_id=client
&client_secret=123123
&scope=all
需要配置認證管理器(定義一個AuthenticationManager認證管理器的Bean)、允許表單登錄配置
返回結果:
{"access_token":"ff1888bf-97d7-4586-8035-606ab0966bee","token_type":"bearer","refresh_token":"5c397383-9e16-48fe-aaf8-f611b0fc08e7","expires_in":3394,"scope":"all"}

 

 

 

 

4、客戶端模式

http://localhost:8080/oauth/token?
grant_type=client_credentials
&scope=all
&client_id=client
&client_secret=123123
返回結果:
{"access_token":"4e27b802-b9cf-4590-b5dd-6508965f0730","token_type":"bearer","expires_in":3599,"scope":"all"}

 

 

 

 

其中簡化模式與客戶端容易記混,現在來對比一下

  簡化模式 客戶端模式
描述

有些 Web 應用是純前端應用,沒有后端。這時就不能用上面的方式了,必須將令牌儲存在前端。

簡化模式不通過第三方應用程序的服務器,直接在瀏覽器中向授權服務器申請令牌,跳過了"授權碼"
個步驟,所有步驟在瀏覽器中完成,令牌對訪問者是可見的,且客戶端不需要認證。

客戶端模式(Client Credentials Grant)指客戶端以自己的名義,而不是以用戶的名義,向"服務提供商"進行授權。
適用於沒有前端的命令行應用,即在命令行下請求令牌。一般用來提供給我們完全信任的服務器端服務
請求方式 向認證服務器傳入字段:
response_type=token
client_id
redirect_uri
scope

 向認證服務器傳入字段:

grant_type=client_credentials
client_id
client_secret
scope

返回方式  URL返回,access_token拼接在#后面,以錨點的形式  返回json

 拿到access_token如何使用?

1、在Authorization中加入access_token訪問

 

 

2、在請求頭加上Authorization(注意:要在access_token前面加上"bearer ",后面有個空格)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM