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 } }