1.1、修改**方法,獲得到token後,由存放到session改為存放到cookie
/**1.2、寫乙個cookietokenfilter,將token從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.3、判斷使用者登陸狀態,從閘道器中獲取,mefilter放到授權filter之後。因為之間基於session,直接從客戶端伺服器中獲取就行,現在不急於session,客戶端不知道使用者登陸狀態,去閘道器獲取。* 將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
; }
}
之前配置了以api開頭的請求會**到閘道器
閘道器配置
閘道器過濾器mefilter
/**1.4、啟動各專案,進行測試* 使用者判斷當前使用者是否認證
* *
@author
caofanqi
* @date 2020/2/7 21:43 */
@component
public
class mefilter extends
zuulfilter
@override
public
intfilterorder()
/*** 只處理/user/me請求
*/@override
public
boolean
shouldfilter()
/*** 判斷請求頭中有沒有我們放入的username,後直接返回,不繼續往下走
}
過期時間設定如下
檢視瀏覽器cookie如下
1.5、但是現在還有乙個問題,認證資訊放在cookie中,退出時,也要將cookie刪除
//2.1、優點:退出function logout() );
//將瀏覽器中的cookie也刪除
$.removecookie('access_token', );
$.removecookie('refresh_token', );
//客戶端session失效後,將認證伺服器session也失效掉,新增重定向url
location.href = "";
}
複雜度低,相對於基於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進動物園 到了門口,驗票的時候,張三沒有買票被拒絕進入動物園,李四因為買假票而被補,趙六被執勤人員抓獲,只有張三進去了動物園 後來大家才知道,當乙個使用者...