jwt如何防止token被窃取_JWT令牌
6.3.1 JWT介紹
通過上邊的測試我們發(fā)現(xiàn),當(dāng)資源服務(wù)和授權(quán)服務(wù)不在一起時資源服務(wù)使用RemoteTokenServices 遠(yuǎn)程請求授權(quán)服務(wù)驗證token,如果訪問量較大將會影響系統(tǒng)的性能 。
解決上邊問題:
令牌采用JWT格式即可解決上邊的問題,用戶認(rèn)證通過會得到一個JWT令牌,JWT令牌中已經(jīng)包括了用戶相關(guān)的信息,客戶端只需要攜帶JWT訪問資源服務(wù),資源服務(wù)根據(jù)事先約定的算法自行完成令牌校驗,無需每次都請求認(rèn)證服務(wù)完成授權(quán)。
1、什么是JWT?
JSON Web Token(JWT)是一個開放的行業(yè)標(biāo)準(zhǔn)(RFC 7519),它定義了一種簡介的、自包含的協(xié)議格式,用于在通信雙方傳遞json對象,傳遞的信息經(jīng)過數(shù)字簽名可以被驗證和信任。JWT可以使用HMAC算法或使用RSA的公鑰/私鑰對來簽名,防止被篡改。
官網(wǎng):JWT.IO
標(biāo)準(zhǔn): JSON Web Token (JWT)
JWT令牌的優(yōu)點(diǎn):
1)jwt基于json,非常方便解析。
2)可以在令牌中自定義豐富的內(nèi)容,易擴(kuò)展。
3)通過非對稱加密算法及數(shù)字簽名技術(shù),JWT防止篡改,安全性高。
4)資源服務(wù)使用JWT可不依賴認(rèn)證服務(wù)即可完成授權(quán)。
缺點(diǎn):
1)JWT令牌較長,占存儲空間比較大。
2、JWT令牌結(jié)構(gòu)
通過學(xué)習(xí)JWT令牌結(jié)構(gòu)為自定義jwt令牌打好基礎(chǔ)。
JWT令牌由三部分組成,每部分中間使用點(diǎn)(.)分隔,比如:xxxxx.yyyyy.zzzzz
- Header
頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
一個例子如下:
下邊是Header部分的內(nèi)容
{ "alg": "HS256","typ": "JWT" }將上邊的內(nèi)容使用Base64Url編碼,得到一個字符串就是JWT令牌的第一部分。
- Payload
第二部分是負(fù)載,內(nèi)容也是一個json對象,它是存放有效信息的地方,它可以存放jwt提供的現(xiàn)成字段,比如:iss(簽發(fā)者),exp(過期時間戳), sub(面向的用戶)等,也可自定義字段。
此部分不建議存放敏感信息,因為此部分可以解碼還原原始內(nèi)容。
最后將第二部分負(fù)載使用Base64Url編碼,得到一個字符串就是JWT令牌的第二部分。
一個例子:
{ "sub": "1234567890","name": "456","admin": true }- Signature
第三部分是簽名,此部分用于防止jwt內(nèi)容被篡改。
這個部分使用base64url將前兩部分進(jìn)行編碼,編碼后使用點(diǎn)(.)連接組成字符串,最后使用header中聲明簽名算法進(jìn)行簽名。
一個例子:
HMACSHA256( base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:簽名所使用的密鑰。
6.3.2 配置JWT令牌服務(wù)
在uaa中配置jwt令牌服務(wù),即可實(shí)現(xiàn)生成jwt格式的令牌。
1、TokenConfig
@Configuration2、定義JWT令牌服務(wù)
@Autowired6.3.3 生成jwt令牌
6.3.4 校驗jwt令牌
資源服務(wù)需要和授權(quán)服務(wù)擁有一致的簽字、令牌服務(wù)等:
1、將授權(quán)服務(wù)中的TokenConfig類拷貝到資源 服務(wù)中
2、屏蔽資源 服務(wù)原來的令牌服務(wù)類
@Configuration3、測試
1)申請jwt令牌
2)使用令牌請求資源
小技巧:
令牌申請成功可以使用/uaa/oauth/check_token校驗令牌的有效性,并查詢令牌的內(nèi)容,例子如下:
6.4 完善環(huán)境配置
截止目前客戶端信息和授權(quán)碼仍然存儲在內(nèi)存中,生產(chǎn)環(huán)境中通過會存儲在數(shù)據(jù)庫中,下邊完善環(huán)境的配置:
6.4.1 創(chuàng)建表
在user_db中創(chuàng)建如下表:
DROP TABLE IF EXISTS `oauth_client_details`; CREATE TABLE `oauth_client_details` (`client_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客戶端標(biāo) 識',`resource_ids` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接入資源列表',`client_secret` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客戶端秘鑰',`scope` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authorized_grant_types` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`web_server_redirect_uri` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authorities` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`access_token_validity` int(11) NULL DEFAULT NULL,`refresh_token_validity` int(11) NULL DEFAULT NULL,`additional_information` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL,`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),`archived` tinyint(4) NULL DEFAULT NULL,`trusted` tinyint(4) NULL DEFAULT NULL,`autoapprove` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`client_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '接入客戶端信息' ROW_FORMAT = Dynamic; INSERT INTO `oauth_client_details` VALUES ('c1', 'res1', '$2a$10$NlBC84MVb7F95EXYTXwLneXgCca6/GipyWR5NHm8K0203bSQMLpvm', 'ROLE_ADMIN,ROLE_USER,ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', NULL, 7200, 259200, NULL, '2019‐09‐09 16:04:28', 0, 0, 'false'); INSERT INTO `oauth_client_details` VALUES ('c2', 'res2', '$2a$10$NlBC84MVb7F95EXYTXwLneXgCca6/GipyWR5NHm8K0203bSQMLpvm', 'ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', NULL, 31536000, 2592000, NULL, '2019‐09‐09 21:48:51', 0, 0, 'false');oauth_code表,Spring Security OAuth2使用,用來存儲授權(quán)碼:
DROP TABLE IF EXISTS `oauth_code`; CREATE TABLE `oauth_code` (`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authentication` blob NULL,INDEX `code_index`(`code`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;6.4.2 配置授權(quán)服務(wù)
(1)修改AuthorizationServer:
ClientDetailsService和AuthorizationCodeServices從數(shù)據(jù)庫讀取數(shù)據(jù)。
@Configuration6.4.3測試
1、測試申請令牌
使用密碼模式申請令牌,客戶端信息需要和數(shù)據(jù)庫中的信息一致。
POST http://localhost:53020/uaa/oauth/token2、測試授權(quán)碼模式
生成的授權(quán)存儲到數(shù)據(jù)庫中。
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=http://www.baidu.com注意scope=?,查看數(shù)據(jù)庫
POST http://localhost:53020/uaa/oauth/token總結(jié)
以上是生活随笔為你收集整理的jwt如何防止token被窃取_JWT令牌的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdi线缆标准_松下会议摄像机新品AWU
- 下一篇: layui 刷新页面_layuimini