Go jwt 验证

设计知识点

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

代码

package main

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

const SecretKey string = "123123123123"

type Payload struct{
    Name string
    Claims jwt.StandardClaims
}

func (p Payload) Valid() error {
    panic("implement me")
}

func main(){
    // jwt 简单使用
    // jwt 组成 header.payload.signature 中间 用 "." 进行相连接
    // 生成 token
    token, _ := GenerateToken("zxx", "123")
    // 解析 token
    parseToken, _ := ParseToken(token)
    fmt.Println(parseToken)
}

// 生成 token
func GenerateToken(username, password string)(string, error){
    nowTime := time.Now()  //当前时间
    expireTime := nowTime.Add(3 * time.Hour)  //有效时间

    // 此处为 jwt 的请求 中间 payload 部分 可任意添加 内容
    tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, Payload{
        Name: "zhao",

        Claims: jwt.StandardClaims{
        ExpiresAt: expireTime.Unix(), // 过期时间
        Issuer:    "jack",            // 发行人
        //Audience     接收者
        //Id           jwt 的编号
        //IssuedAt     签发时间
        //NotBefore    签名生效时间
        //Subject      主题

    }})

    // 此处为 增加 密钥 生成完整的 jwt 个人理解: jwt的 第三部分
    signedString, err := tokenClaims.SignedString(SecretKey)
    return signedString, err
}

// 解析 token
func ParseToken(tokenStr string)(string, error){
    // 解析 token
    token, _ := jwt.ParseWithClaims(tokenStr, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
        return "", nil
    })

    // 头部 token.Header  中间部分 token.Claims 尾部 token.Signature
    // 取 jwt 中间部分
    claims, _ := token.Claims.(jwt.MapClaims)

    // 检查令牌是否有效
    if token.Valid{
        return claims["claims"].(string), nil
    } else {
        return claims["claims"].(string), errors.New("token无效")
    }
}

 

posted @ 2021-02-19 18:39  Black_Climber  阅读(463)  评论(0编辑  收藏  举报