Golang学习笔记之使用JWT

前言

JWT包

包:github.com/dgrijalva/jwt-go

文档:传送门

Demo

package main

import (
    "fmt"
    "time"

    "github.com/dgrijalva/jwt-go"
)

// Claims is jwt struct
type Claims struct {
    ID        int64  `json:"id,omitempty"`
    LoginName string `json:"name,omitempty"`
    jwt.StandardClaims
}

var jwtSecret string = "golang-test"

func main() {
    exp := time.Now().Add(time.Duration(1) * time.Hour)
    user := Claims{
        ID:        1,
        LoginName: "golang",
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: exp.Unix(),
        },
    }

    token, err := Encode(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(token)

    claims, err := Decode(token)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(claims)
}

// Encode is jwt Encoder
func Encode(claims Claims) (string, error) {
    tokenHandler := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return tokenHandler.SignedString([]byte(jwtSecret))
}

// Decode is jwt Decoder
func Decode(token string) (Claims, error) {
    claims := Claims{}

    _, err := jwt.ParseWithClaims(token, &claims, func(t *jwt.Token) (interface{}, error) {
        if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"])
        }
        return []byte(jwtSecret), nil
    })

    return claims, err
}

最后

这个需要理解一下其概念。

同时,jwt.StandardClaims 中已经定义了一些自定义的字段,我们需要根据实际场景进行重写(主要是类型)。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!