go-micro微服務(wù)JWT跨域認(rèn)證問題
一 JWT介紹
JWT 英文名是 Json Web Token ,是一種用于通信雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規(guī)范,經(jīng)常用在跨域身份驗(yàn)證。
JWT 以 JSON 對(duì)象的形式安全傳遞信息。因?yàn)榇嬖跀?shù)字簽名,因此所傳遞的信息是安全的。
一個(gè)JWT Token就像這樣:
eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAx0DcyNzQ40DMyMzU4NSwiZ
XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHV1YmVsbCJ9.1k_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX0iZYFx9wU
它是由.分隔的三部分組成,這三部分依次是:
- 頭部(Header)
- 負(fù)載(Payload)
- 簽名(Signature)
頭部和負(fù)載以jSON形式存在,這就是JWT中的JSON,三部分的內(nèi)容都分別單獨(dú)經(jīng)過了Base64編
碼,以.拼接成一個(gè)JWT Token。
二 JWT優(yōu)缺點(diǎn)
JWT擁有基于Token的會(huì)話管理方式所擁有的一切優(yōu)勢,不依賴Cookie,使得其可以防止CSRF攻
擊,也能在禁用Cookie的瀏覽器環(huán)境中正常運(yùn)行。
而JWT的最大優(yōu)勢是服務(wù)端不再需要存儲(chǔ)Session,使得服務(wù)端認(rèn)證鑒權(quán)業(yè)務(wù)可以方便擴(kuò)展,避免存儲(chǔ)
Session所需要引入的Redis等組件,降低了系統(tǒng)架構(gòu)復(fù)雜度。但這也是JWT最大的劣勢,由于有效期
存儲(chǔ)在Token中,JWT Token一旦簽發(fā),就會(huì)在有效期內(nèi)一直可用,無法在服務(wù)端廢止,當(dāng)用戶進(jìn)行登
出操作,只能依賴客戶端刪除掉本地存儲(chǔ)的JWT Token,如果需要禁用用戶,單純使用JWT就無法做到。
三 JWT使用
1. 導(dǎo)包和數(shù)據(jù)定義
package token
import (
"account/config/redis"
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
// MyClaims 自定義聲明結(jié)構(gòu)體并內(nèi)嵌jwt.StandardClaims
// jwt包自帶的jwt.StandardClaims只包含了官方字段
// 我們這里需要額外記錄一個(gè)username字段,所以要自定義結(jié)構(gòu)體
// 如果想要保存更多信息,都可以添加到這個(gè)結(jié)構(gòu)體中
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) {
// 創(chuàng)建一個(gè)我們自己的聲明
c := MyClaims{
UserName, // 自定義字段
jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時(shí)間
Issuer: "Account", // 簽發(fā)人
},
}
// 使用指定的簽名方法創(chuàng)建簽名對(duì)象
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 { // 校驗(yàn)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 自定義聲明結(jié)構(gòu)體并內(nèi)嵌jwt.StandardClaims
// jwt包自帶的jwt.StandardClaims只包含了官方字段
// 我們這里需要額外記錄一個(gè)username字段,所以要自定義結(jié)構(gòu)體
// 如果想要保存更多信息,都可以添加到這個(gè)結(jié)構(gòu)體中
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) {
// 創(chuàng)建一個(gè)我們自己的聲明
c := MyClaims{
UserName, // 自定義字段
jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時(shí)間
Issuer: "Account", // 簽發(fā)人
},
}
// 使用指定的簽名方法創(chuàng)建簽名對(duì)象
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 { // 校驗(yàn)token
return mc, nil
}
return nil, errors.New("invalid token")
}
四 最后
至此,go-micro微服務(wù)JWT跨域認(rèn)證工作就正式完成。
接下來就開始公用函數(shù)的代碼編寫了,希望大家關(guān)注博主和關(guān)注專欄,第一時(shí)間獲取最新內(nèi)容,每篇博客都干貨滿滿。
到此這篇關(guān)于go-micro微服務(wù)JWT跨域認(rèn)證的文章就介紹到這了,更多相關(guān)go-micro微服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Go語言實(shí)現(xiàn)讀取本地文本文件內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何使用Go語言實(shí)現(xiàn)讀取本地文本文件內(nèi)容功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下2025-07-07
從并發(fā)到并行解析Go語言中的sync.WaitGroup
Go?語言提供了許多工具和機(jī)制來實(shí)現(xiàn)并發(fā)編程,其中之一就是?sync.WaitGroup。本文就來深入討論?sync.WaitGroup,探索其工作原理和在實(shí)際應(yīng)用中的使用方法吧2023-05-05
Go語言實(shí)現(xiàn)簡單的一個(gè)靜態(tài)WEB服務(wù)器
這篇文章主要介紹了Go語言實(shí)現(xiàn)簡單的一個(gè)靜態(tài)WEB服務(wù)器,本文給出了實(shí)現(xiàn)代碼和運(yùn)行效果,學(xué)習(xí)Golang的練手作品,需要的朋友可以參考下2014-10-10

