Golang语言社区Golang 入门资料+笔记Go

(进阶)goland+jwt实现用户登录获取token

2021-02-10  本文已影响0人  五岁小孩

(进阶)golang+gin+jwt实现用户登录获取token

//请求
header 里面
    "Token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ4aiIsImV4cCI6MTU3Nzg2NjU1NiwiaWF0IjoiMjAxOS0xMi0zMVQxNjoxNTo1NS4zNDUyODkrMDg6MDAiLCJpc3MiOiJpdHhqIiwianRpIjoieGppdHhqMTU3Nzc4MDE1NCIsIm5iZiI6MTU3Nzc4MDE1NSwic3ViIjoieGoifQ.zg0FtD4Ovk0GysPSxn2IZfFkvA6KmqbczDPu9zQDFk4"

gin router api

    router.GET("/api/validateToken/:key", service.ValidateTokenService(), service.TestValidateTokenService)

路由中间件—-:校验token是否有效

//路由中间件校验token
func ValidateTokenService() gin.HandlerFunc {

    return func(c *gin.Context) {

        token, err := request.ParseFromRequest(c.Request, request.AuthorizationHeaderExtractor, func(token *jwt.Token) (i interface{}, e error) {
            return []byte(tokenApiSecret), nil
        })
        if err != nil {
            c.Abort()
            c.JSON(http.StatusOK, gin.H{
                "code":    http.StatusUnauthorized,
                "message": "fail",
                "error":   "Unauthorized!",
            })
            return
        }
        if !token.Valid {
            c.Abort()
            c.JSON(http.StatusOK, gin.H{
                "code":    http.StatusUnauthorized,
                "message": "fail",
                "error":   "An invalid Token!",
            })
            return
        }
        c.Next()
    }
}

service:

//获取token中的账号
func TestValidateTokenService(c *gin.Context) {
    sub := c.Param("key")
    token, _ := GetTokenFromRequest(c)
    claimsVal := GetValueFromTokenClaims(sub, token.Claims)
    c.JSON(http.StatusOK, gin.H{
        "code":      http.StatusOK,
        "message":   "成功",
        "claimsVal": claimsVal,
    })
    return
}

//从请求头中获取token
func GetTokenFromRequest(c *gin.Context) (token *jwt.Token, err error) {
    token, err = request.ParseFromRequest(c.Request, request.AuthorizationHeaderExtractor,
        func(token *jwt.Token) (interface{}, error) {
            return []byte(tokenApiSecret), nil
        })
    return token, err
}

//根据key从载荷中获取数据
func GetValueFromTokenClaims(key string, claims jwt.Claims) string {
    v := reflect.ValueOf(claims)
    if v.Kind() == reflect.Map {
        for _, k := range v.MapKeys() {
            value := v.MapIndex(k)

            if fmt.Sprintf("%s", k.Interface()) == key {
                return fmt.Sprintf("%v", value.Interface())
            }
        }
    }
    return ""
}

上一篇 下一篇

猜你喜欢

热点阅读