JWT Go 示例代码

Golang 通过第三方库支持 JWT。

客户端与服务端通过 JWT 交互,服务端通过解密 token 信息,来实现用户认证。

使用 JWT 不需要服务端集中维护 token 信息,便于扩展。

JWT 也有缺点,我们可以采用变通的手段来解决这些问题:

  • 用户无法主动登录,只要 token 在有效期内就有效,所以我们在程序中必须设置有效期。
  • token 过了有效期,无法续签问题。可以考虑通过判断旧的 token 什么时候到期,过期的时候刷新token续签接口产生新token代替旧token。

Golang JWT 第三方库很多,我们推荐使用开源项目 http://github.com/dgrijalva/jwt-go

Golang 使用 JWT 的示例代码:

package main
import (
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "time"
)
const (
    SECRETKEY = "SSDcodebaokuprivateXRTHHsYsSS" //私钥
)

func main() {  
    // 生成 claim 数据
    claims := jwt.MapClaims{
        "id":      1, // 私有数据,我们填充了用户id 为 1
        "name":    "codebaoku", // 非必须,可以填充用户名
        "exp": time.Now().Add(time.Duration(60*60*24)*time.Second).Unix(), // 必须设置过期时间,我们设置了 1 天
    }

    // 生成 token
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenStr, err := token.SignedString([]byte(SECRETKEY))
    if err!=nil {
        fmt.Println(err)
    }
    fmt.Printf("token: %v\n", tokenStr)

    // 解析 token
    ret, err :=ParseToken(tokenStr)
    if err!=nil {
        fmt.Println(err)
    }
    fmt.Printf("userinfo: %v\n", ret)
}

// 解析 token
func ParseToken(tokenStr string)(jwt.MapClaims,error)  {
    token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
        // Don't forget to validate the alg is what you expect:
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
        }

        // hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
        return []byte(SECRETKEY), nil
    })
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        return claims,nil
    } else {
        return nil,err
    }
}