認證和SSO 五 基於token的SSO

2022-08-24 10:15:14 字數 3952 閱讀 9698

1.1、修改**方法,獲得到token後,由存放到session改為存放到cookie

/**

* **方法

* 接收認證伺服器發來的授權碼,並換取令牌**

@param

code 授權碼

* @param

state 請求授權伺服器時傳送的state

//將token放到session中

"token", authresult.getbody().init());

//將token放到cookie中

cookie accesstokencookie = new cookie("access_token",authresult.getbody().getaccess_token());

accesstokencookie.setmaxage(authresult.getbody().getexpires_in().intvalue() - 5);

accesstokencookie.setdomain("caofanqi.cn");

accesstokencookie.setpath("/");

response.addcookie(accesstokencookie);

cookie refreshtokencookie = new cookie("refresh_token",authresult.getbody().getrefresh_token());

refreshtokencookie.setmaxage(2592000);

refreshtokencookie.setdomain("caofanqi.cn");

refreshtokencookie.setpath("/");

response.addcookie(refreshtokencookie);

log.info("state :{}", state);

//一般會根據state記錄需要登陸時的路由

response.sendredirect("/");

}

1.2、寫乙個cookietokenfilter,將token從cookie中取出來

/**

* 將cookie中的token取出放到請求頭中

* *

@author

caofanqi

* @date 2020/2/6 0:34 */

@slf4j

@component

public

class cookietokenfilter extends

zuulfilter

@override

public

intfilterorder()

@override

public

boolean

shouldfilter()

@override

public object run() throws

zuulexception

else

catch

(exception e) ");}}

else

"); }

}return

null

; }

/*** 獲取cookie的值

*/private

string getcookie(string cookiename)

}return

null

; }

}

1.3、判斷使用者登陸狀態,從閘道器中獲取,mefilter放到授權filter之後。因為之間基於session,直接從客戶端伺服器中獲取就行,現在不急於session,客戶端不知道使用者登陸狀態,去閘道器獲取。

之前配置了以api開頭的請求會**到閘道器

閘道器配置

閘道器過濾器mefilter

/**

* 使用者判斷當前使用者是否認證

* *

@author

caofanqi

* @date 2020/2/7 21:43 */

@component

public

class mefilter extends

zuulfilter

@override

public

intfilterorder()

/*** 只處理/user/me請求

*/@override

public

boolean

shouldfilter()

/*** 判斷請求頭中有沒有我們放入的username,後直接返回,不繼續往下走

}

1.4、啟動各專案,進行測試

過期時間設定如下

檢視瀏覽器cookie如下

1.5、但是現在還有乙個問題,認證資訊放在cookie中,退出時,也要將cookie刪除

//

退出function logout() );

//將瀏覽器中的cookie也刪除

$.removecookie('access_token', );

$.removecookie('refresh_token', );

//客戶端session失效後,將認證伺服器session也失效掉,新增重定向url

location.href = "";

}

2.1、優點:

複雜度低,相對於基於session的sso來說,只需要做access_token和refresh_token的過期處理。

不占用伺服器資源,適合使用者量特別大的系統。因為token存在瀏覽器cookie中,只有cookie中的refresh_token失效時,才會去認證伺服器登陸。不需要認證伺服器設定有效期很長的session。因為通過token就可以訪問微服務。

2.2、缺點:

安全性低:token存在瀏覽器,有一定的風險。可以使用https,縮短access_token的有效期來防範。

可控性低:token存在瀏覽器,沒辦法主動失效掉。

跨域問題:cookie只能放在頂級網域名稱下(caofanqi.cn),只有二級網域名稱(web.caofanqi.cn、order.caofanqi.cn)才可以做sso。如果要與baidu.com做sso的話,需要同時設定多個cookie。

專案原始碼:

基於Token的認證和基於宣告的標識

openid解決跨站點的認證問題,oauth解決跨站點的授權問題。認證和授權是密不可分的。而openid和oauth這兩套協議出自兩個不同的組織,協議上有相似和重合的之處,所以想將二者整合有些難度。好在openid connect作為openid的下一版本,在oauth 2.0的協議基礎上進行擴充套...

基於Token認證的多點登入和WebApi保護

原文 基於token認證的多點登入和webapi保護 一天張三,李四,王五,趙六去動物園,張三沒買票,李四製作了個假票,王五買了票,趙六要直接fq進動物園 到了門口,驗票的時候,張三沒有買票被拒絕進入動物園,李四因為買假票而被補,趙六被執勤人員抓獲,只有張三進去了動物園 後來大家才知道,當乙個使用者...

基於Token認證的多點登入和WebApi保護

原文 基於token認證的多點登入和webapi保護 一天張三,李四,王五,趙六去動物園,張三沒買票,李四製作了個假票,王五買了票,趙六要直接fq進動物園 到了門口,驗票的時候,張三沒有買票被拒絕進入動物園,李四因為買假票而被補,趙六被執勤人員抓獲,只有張三進去了動物園 後來大家才知道,當乙個使用者...