jwt-go

作者: 王哈哈就很棒 | 来源:发表于2020-07-27 16:23 被阅读0次

    关于JWT参考 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

    package main
    
    import (
        "fmt"
        "github.com/develop1024/jwt-go"
        "time"
    )
    
    // 生成token
    func GenerateToken(secret []byte, claims jwt.MapClaims) (tokenString string, err error) {
        // 创建一个新的令牌对象,指定签名方法和声明
        token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    
        // 使用密码签名并获得完整的编码令牌作为字符串
        tokenString, err = token.SignedString(secret)
        return
    }
    
    // 解析token
    func ParseToken(tokenString string, secret []byte) (jwt.MapClaims, error) {
        token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
            if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
                return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
            }
            return secret, nil
        })
    
        if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
            return claims, nil
        } else {
            return nil, err
        }
    }
    
    func main() {
        // payload 存放实际需要传递的数据
        data := jwt.MapClaims{
            "iss": "wang",
            "exp": time.Now().Add(time.Second * 1).Unix(),
            "foo": "bar",
        }
    
        // 生成token
        token, err := GenerateToken([]byte("abc"), data)
        if err != nil {
            panic(err)
        }
        fmt.Println("token: ", token)
    
        // 解析token
        claims, err := ParseToken(token, []byte("abc"))
        if err != nil {
            fmt.Println(err)
        } else {
            // 解析token拿到里面的数据
            fmt.Println(claims["exp"])
            fmt.Println(claims["foo"])
        }
    }
    
    
    

    输出

    token:  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTU4MzgzNzYsImZvbyI6ImJhciIsImlzcyI6IndhbmcifQ.O7hjWoQK3gL3aKbDSGGsmvtqnsowjphjiJ4_Gzl1L9c
    1.595838376e+09
    bar
    

    主要

    // 生成token
    func GenerateToken(secret []byte, claims jwt.MapClaims) (tokenString string, err error) {
        // 创建一个新的令牌对象,指定签名方法和声明
        token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    
        // 使用密码签名并获得完整的编码令牌作为字符串
        tokenString, err = token.SignedString(secret)
        return
    }
    
    // 解析token
    func ParseToken(tokenString string, secret []byte) (jwt.MapClaims, error) {
        token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
            if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
                return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
            }
            return secret, nil
        })
    
        if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
            return claims, nil
        } else {
            return nil, err
        }
    }
    

    封装后

    package main
    
    import (
        "fmt"
        "github.com/develop1024/gojwt"
        "time"
    )
    
    func main() {
        // 生成token
        secret := []byte("hello secret")
        token, err := gojwt.GenerateToken(secret, map[string]interface{}{
            "iss": "wang",
            "exp": time.Now().Add(time.Second * 1).Unix(),
            "foo": "bar",
        })
    
        if err != nil {
            panic(err)
        }
    
        fmt.Println("token: ", token)
    
        // 解析token
        claims, err := gojwt.ParseToken(token, secret)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println(claims)
            fmt.Println(claims["exp"])
            fmt.Println(claims["iss"])
        }
    }
    
    

    相关文章

      网友评论

          本文标题:jwt-go

          本文链接:https://www.haomeiwen.com/subject/dunzlktx.html