網站首頁 編程語言 正文
一 JWT介紹
JWT 英文名是 Json Web Token ,是一種用于通信雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規范,經常用在跨域身份驗證。
JWT 以 JSON 對象的形式安全傳遞信息。因為存在數字簽名,因此所傳遞的信息是安全的。
一個JWT Token就像這樣:
eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAx0DcyNzQ40DMyMzU4NSwiZ
XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHV1YmVsbCJ9.1k_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX0iZYFx9wU
它是由.分隔的三部分組成,這三部分依次是:
- 頭部(Header)
- 負載(Payload)
- 簽名(Signature)
頭部和負載以jSON形式存在,這就是JWT中的JSON,三部分的內容都分別單獨經過了Base64編
碼,以.拼接成一個JWT Token。
二 JWT優缺點
JWT擁有基于Token的會話管理方式所擁有的一切優勢,不依賴Cookie,使得其可以防止CSRF攻
擊,也能在禁用Cookie的瀏覽器環境中正常運行。
而JWT的最大優勢是服務端不再需要存儲Session,使得服務端認證鑒權業務可以方便擴展,避免存儲
Session所需要引入的Redis等組件,降低了系統架構復雜度。但這也是JWT最大的劣勢,由于有效期
存儲在Token中,JWT Token一旦簽發,就會在有效期內一直可用,無法在服務端廢止,當用戶進行登
出操作,只能依賴客戶端刪除掉本地存儲的JWT Token,如果需要禁用用戶,單純使用JWT就無法做到。
三 JWT使用
1. 導包和數據定義
package token import ( "account/config/redis" "errors" "fmt" "github.com/dgrijalva/jwt-go" "time" ) // MyClaims 自定義聲明結構體并內嵌jwt.StandardClaims // jwt包自帶的jwt.StandardClaims只包含了官方字段 // 我們這里需要額外記錄一個username字段,所以要自定義結構體 // 如果想要保存更多信息,都可以添加到這個結構體中 type MyClaims struct { UserName string `json:"username"` jwt.StandardClaims } const TokenExpireDuration = time.Hour * 2 var MySecret = []byte("Account")
2.生成JWT
// GenToken 生成JWT func GenToken(UserName string) (string, error) { // 創建一個我們自己的聲明 c := MyClaims{ UserName, // 自定義字段 jwt.StandardClaims{ ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時間 Issuer: "Account", // 簽發人 }, } // 使用指定的簽名方法創建簽名對象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 使用指定的secret簽名并獲得完整的編碼后的字符串token return token.SignedString(MySecret) }
3.解析JWT
// ParseToken 解析JWT func ParseToken(tokenString string) (*MyClaims, error) { // 解析token var mc = new(MyClaims) token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) { return MySecret, nil }) if err != nil { return nil, err } if token.Valid { // 校驗token return mc, nil } return nil, errors.New("invalid token") }
4.完整代碼
package token import ( "account/config/redis" "errors" "fmt" "github.com/dgrijalva/jwt-go" "time" ) // MyClaims 自定義聲明結構體并內嵌jwt.StandardClaims // jwt包自帶的jwt.StandardClaims只包含了官方字段 // 我們這里需要額外記錄一個username字段,所以要自定義結構體 // 如果想要保存更多信息,都可以添加到這個結構體中 type MyClaims struct { UserName string `json:"username"` jwt.StandardClaims } const TokenExpireDuration = time.Hour * 2 var MySecret = []byte("Account") // GenToken 生成JWT func GenToken(UserName string) (string, error) { // 創建一個我們自己的聲明 c := MyClaims{ UserName, // 自定義字段 jwt.StandardClaims{ ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時間 Issuer: "Account", // 簽發人 }, } // 使用指定的簽名方法創建簽名對象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // 使用指定的secret簽名并獲得完整的編碼后的字符串token return token.SignedString(MySecret) } // ParseToken 解析JWT func ParseToken(tokenString string) (*MyClaims, error) { // 解析token var mc = new(MyClaims) token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) { return MySecret, nil }) if err != nil { return nil, err } if token.Valid { // 校驗token return mc, nil } return nil, errors.New("invalid token") }
四 最后
至此,go-micro微服務JWT跨域認證工作就正式完成。
接下來就開始公用函數的代碼編寫了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇博客都干貨滿滿。
原文鏈接:https://www.cnblogs.com/qi66/p/17054818.html
相關推薦
- 2022-06-20 一文帶你掌握Go語言運算符的使用_Golang
- 2023-04-06 Python求字符串的長度示例代碼_python
- 2023-01-21 Python中的二維列表使用及說明_python
- 2022-04-12 Python?設計模式行為型訪問者模式_python
- 2022-03-15 使用swagger-bootstrap-ui ,訪問的時候 404
- 2021-12-18 linux下安裝redis圖文詳細步驟_Redis
- 2021-12-14 nginx.pid打開失敗以及失效的解決方案_nginx
- 2022-09-23 python?pandas創建多層索引MultiIndex的6種方式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支