美文网首页go
go-jwt 实现 token

go-jwt 实现 token

作者: 莫夏_b560 | 来源:发表于2018-12-12 16:21 被阅读0次
    package main
    
    import (
        "github.com/dgrijalva/jwt-go"
        "log"
        "fmt"
        "errors"
        "time"
    )
    
    // 一些常量
    var (
        TokenExpired     error  = errors.New("Token is expired")
        TokenNotValidYet error  = errors.New("Token not active yet")
        TokenMalformed   error  = errors.New("That's not even a token")
        TokenInvalid     error  = errors.New("Couldn't handle this token:")
        SignKey          string = "newtrekWang"
    )
    
    type JWT struct {
        SigningKey []byte
    }
    
    type CustomClaims struct {
        ID    string `json:"userId"`
        Name  string `json:"name"`
        Phone string `json:"phone"`
        jwt.StandardClaims
    }
    
    //创建token
    func (j *JWT) CreateToken(claims CustomClaims) (string, error) {
        token := jwt.New(jwt.SigningMethodHS256)
        token.Claims = claims
        res, err := token.SignedString(j.SigningKey)
        fmt.Println("err:", err)
        return res, err
    }
    
    //解析token
    func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
        token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
            if _, ok := token.Method.(*jwt.SigningMethodECDSA); !ok {
                log.Panicln("unexpected signing method")
                return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
            }
            return j.SigningKey, nil
        })
    
        if err != nil {
            return nil, err
        }
    
        if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
            return claims, nil
        }
        return nil, TokenInvalid
    }
    
    //更新token
    func (j *JWT) RefreshToken(tokenString string) (string, error) {
        jwt.TimeFunc = func() time.Time {
            return time.Unix(0, 0)
        }
    
        token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
            return j.SigningKey, nil
        })
    
        if err != nil {
            return "", err
        }
    
        if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
            jwt.TimeFunc = time.Now
            claims.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
            return j.CreateToken(*claims)
        }
    
        return "", TokenInvalid
    }
    
    func Login(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
        generateToken(w)
    }
    
    func generateToken(w http.ResponseWriter) {
        j := &JWT{[]byte("man")}
        claims := CustomClaims{
            "1", "Jaya", "123456", jwt.StandardClaims{
                NotBefore: int64(time.Now().Unix() - 1000),
                ExpiresAt: int64(time.Now().Unix() + 3600),
                Issuer:    "man",
            },
        }
    
        token, err := j.CreateToken(claims)
        if err != nil {
            io.WriteString(w, "it is wrong")
        }
    
        io.WriteString(w, token)
    }
    

    测试

    package main
    
    import (
        "github.com/julienschmidt/httprouter"
        "net/http"
    )
    
    func Register() *httprouter.Router{
        router := httprouter.New()
        router.POST("/reg", Reg)
        router.POST("/login", Login)
        return router
    }
    
    func main() {
        router := Register()
        http.ListenAndServe(":8005", router)
    }
    

    相关文章

      网友评论

        本文标题:go-jwt 实现 token

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