2018-11-16 16:16:52

json web token

JWT是json web token缩写。
官网 它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

  • 优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。
  • 缺点是无法作废已颁布的令牌/不易应对数据过期。

数据格式

  • Header
  • Payload
  • Signature

xxxxx.yyyyy.zzzzz

Signature= alt

常用库
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
    • }
    clean
  • 生成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()))
    • }
    pgsql
  • 验证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)
    • }
    • }
    go

本文链接:https://blog.zxysilent.com/post/jwt.html

-- EOF --

Comments