JWT是json web token
缩写。
官网
它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
- 优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了
session
共享的问题。 - 缺点是无法作废已颁布的令牌/不易应对数据过期。
数据格式
- Header
- Payload
- Signature
xxxxx.yyyyy.zzzzz
Signature=
常用库go get github.com/dgrijalva/jwt-go
使用实例
- 携带数据
- // JwtClaims jwt
- type JwtClaims struct {
- Id int `json:"id"`
- Name string `json:"name"`
- Num string `json:"num"`
- Role Role `json:"role"`
- jwt.StandardClaims
- }
- 生成token
- claims := model.JwtClaims{
- Id: mod.Id,
- Name: mod.Name,
- Num: mod.Num,
- Role: mod.Role,
- StandardClaims: jwt.StandardClaims{
- ExpiresAt: time.Now().Add(time.Hour * 2).Unix(),
- },
- }
- // 保存唯一登陆信息
- util.Save(claims.Id, claims.Rand)
- // Create token with claims
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
- // Generate encoded token and send it as response.
- jwtStr, err := token.SignedString([]byte("xxxx"))
- if err != nil {
- return ctx.JSON(util.NewFail(`凭证生成失败,请重试`, err.Error()))
- }
- 验证token
- // midJwt 中间件-jwt验证
- func midJwt(next echo.HandlerFunc) echo.HandlerFunc {
- return func(ctx echo.Context) error {
- // query form 查找 token
- tokenString := ctx.FormValue("token")
- if tokenString == "" {
- // header 查找token
- tokenString = ctx.Request().Header.Get(echo.HeaderAuthorization)
- if tokenString == "" {
- ctx.JSON(util.NewErrJwt(`未发现jwt认证信息`))
- return nil
- }
- // Bearer token
- tokenString = tokenString[7:] //len("Bearer ")
- }
- jwtAuth := &model.JwtClaims{}
- jwt, err := jwt.ParseWithClaims(tokenString, jwtAuth, func(token *jwt.Token) (interface{}, error) {
- return []byte("xxxx"), nil
- })
- if err == nil && jwt.Valid {
- ctx.Set("auth", jwtAuth)
- } else {
- return ctx.JSON(util.NewErrJwt(`对不起,请重新登陆^_^!","jwt验证失败`))
- }
- ctx.Response().Header().Set(echo.HeaderServer, "by zxysilent")
- return next(ctx)
- }
- }
Comments