欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
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 = "SSDaizwsprivateXRTHHsYsSS" //私钥
)
func main() {
// 生成 claim 数据
claims := jwt.MapClaims{
"id": 1, // 私有数据,我们填充了用户id 为 1
"name": "aizws", // 非必须,可以填充用户名
"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
}
}
下一章:JWT PHP 示例代码
PHP 支持 JWT 机制。JWT 将用户信息加密到 token 里,客户端与服务端通过 JWT 交互,服务器不保存任何用户信息。服务器通过使用保存的密钥验证 token 的正确性,只要正确即通过验证。基于toke ...
AI 中文社