Golang JWT Token 驗(yàn)簽 生成

無概念,直接上代碼

生成谱邪、驗(yàn)證
package helpers

import (
    "errors"
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "myapp/config"
    "time"
)

//JWT = JSON WEB TOKEN 是一個開放標(biāo)準(zhǔn),用于作為json對象,在各個地方安全的傳輸信息
//此信息可以被驗(yàn)證和信任

type JWT struct {
    SigningKey []byte //自定義密鑰
}

//自定義信息結(jié)構(gòu),根據(jù)需求填寫
type Claims struct {
    Id                 uint   //用戶id
    NickName           string //用戶名
    AuthorityId        string //用戶角色id
    jwt.StandardClaims
}

//定義錯誤信息
var (
    TokenExpired     = errors.New("Token 已經(jīng)過期")
    TokenNotValidYet = errors.New("Token 未激活")
    TokenMalformed   = errors.New("Token 錯誤")
    TokenInvalid     = errors.New("Token 無效")
)

//NewJWT 初始化
func NewJWT() *JWT {
        //這里要注意馅而,SigningKey 這個值此疹,需要自定義
    return &JWT{SigningKey: []byte(“testqhsjwt”)}
}

//CreateToken 創(chuàng)建 token
func (j *JWT) CreateToken(c Claims) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
    return token.SignedString(j.SigningKey)
}

//ParseToken 解析 token
func (j *JWT) ParseToken(tokenString string) (*Claims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
        return j.SigningKey, nil
    })
    if err != nil {
        if ve, ok := err.(*jwt.ValidationError); ok {
            if ve.Errors&jwt.ValidationErrorMalformed != 0 {
                return nil, TokenMalformed
            } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
                return nil, TokenExpired
            } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
                return nil, TokenNotValidYet
            } else {
                return nil, TokenInvalid
            }
        }
    }
    if token == nil {
        return nil, TokenInvalid
    }
    //解析到Claims 構(gòu)造中
    if c, ok := token.Claims.(*Claims); ok && token.Valid {
        return c, nil
    }
    return nil, TokenInvalid
}

//RefreshToken 更新 token
func (j *JWT) RefreshToken(tokenString string) (string, error) {
    jwt.TimeFunc = func() time.Time {
        return time.Unix(0, 0)
    }
    token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
        return j.SigningKey, nil
    })
    if err != nil {
        return "", err
    }
    if c, ok := token.Claims.(*Claims); ok && token.Valid {
        jwt.TimeFunc = time.Now
        c.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
        return j.CreateToken(*c)
    }
    return "", TokenInvalid
}

二畦浓、使用
func main() {
    //創(chuàng)建token
    token := createToken()
    //驗(yàn)證token
    checkToken(token)
}
//createToken 生成
func createToken() string {
    j := helpers.NewJWT()
    c := helpers.Claims{
        Id:          10001,
        NickName:    "test",
        AuthorityId: "1",
        StandardClaims: jwt.StandardClaims{
            NotBefore: time.Now().Unix() - 1000,       //簽名生效時間
            ExpiresAt: time.Now().Unix() + 60*60*24*7, //簽名過期時間
            Issuer:    "qhs",                          //簽名頒發(fā)者
        },
    }
    token, err := j.CreateToken(c)
    if err != nil {
        fmt.Println("獲取token失敗:", err.Error())
        return ""
    }

    fmt.Println( token)
    return token
}

//checkToken 驗(yàn)證 解碼
func checkToken(token string) {
    j := helpers.NewJWT()
    c, err := j.ParseToken(token)
    if err != nil {
        fmt.Println("解析token失斣春:", err.Error())
        return
    }
    fmt.Printf("id:%v,name:%s,auth:%s , btime : %v ,eTime:%v", c.Id, c.NickName, c.AuthorityId,c.NotBefore,c.ExpiresAt)
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厘熟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子维哈,更是在濱河造成了極大的恐慌绳姨,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔挠,死亡現(xiàn)場離奇詭異飘庄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)购撼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門跪削,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谴仙,“玉大人,你說我怎么就攤上這事碾盐』味澹” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵毫玖,是天一觀的道長掀虎。 經(jīng)常有香客問我,道長付枫,這世上最難降的妖魔是什么烹玉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮阐滩,結(jié)果婚禮上二打,老公的妹妹穿的比我還像新娘。我一直安慰自己叶眉,他們只是感情好址儒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衅疙,像睡著了一般莲趣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱溢,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天喧伞,我揣著相機(jī)與錄音,去河邊找鬼绩郎。 笑死潘鲫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肋杖。 我是一名探鬼主播溉仑,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼状植!你這毒婦竟也來了浊竟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤津畸,失蹤者是張志新(化名)和其女友劉穎振定,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肉拓,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡后频,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暖途。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卑惜。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡膏执,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出残揉,到底是詐尸還是另有隱情胧后,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布抱环,位于F島的核電站壳快,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镇草。R本人自食惡果不足惜眶痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梯啤。 院中可真熱鬧竖伯,春花似錦、人聲如沸因宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽察滑。三九已至打厘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贺辰,已是汗流浹背户盯。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饲化,地道東北人莽鸭。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吃靠,于是被迫代替她去往敵國和親硫眨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348