Json web token (JWT)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.UQmqAUhUrpDVV2ST7mZKyLTomVfg7sYkEjmdDI5XF8Q

三部分构成

  • 第一部头部(header),作用:

    • 声明类型
    • 声明加密的算法 通常直接使用 HMAC SHA256
    {'typ': 'JWT','alg': 'HS256'}
    
    • 将头部进行base64加密
    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
    
  • 第二部分载荷(payload),载荷就是存放有效信息的地方:
    • 标准中注册的声明

      • iss: jwt签发者
      • sub: jwt所面向的用户
      • aud: 接收jwt的一方
      • exp: jwt的过期时间,这个过期时间必须要大于签发时间
      • nbf: 定义在什么时间之前,该jwt都是不可用的.
      • iat: jwt的签发时间
      • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
    • 公共的声明
      • 公共的声明可以添加任何的信息
      • 一般添加用户的相关信息或其他业务需要的必要信息
      • 议添加敏感信息,因为该部分在客户端可解密
    • 私有的声明
      • 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息
    • 举例
      {"sub": "1234567890","name": "John Doe","admin": true}然后将其进行base64加密,得到Jwt的第二部分
      eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9signature
      
  • 第三部分签证(signature)
    • header (base64后的)

    • payload (base64后的)

    • secret

    • 需要base64加密后的header和base64加密后的payload使用"."连接组成的字符串(头部在前),

    • 然后通过header中声明的加密方式进行加secret组合加密,

    • 构成了jwt的第三部分

    • 举例

    UQmqAUhUrpDVV2ST7mZKyLTomVfg7sYkEjmdDI5XF8Q
    
    • secret 需要保存在服务端用来生成token和验证

签名的目的

  • 对头部以及载荷内容进行签名
  • 加密算法对于不同的输入产生的输出总是不一样
  • 对于两个不同的输入,产生同样的输出的概率极其地小
  • JWT的头部中已经用alg字段指明加密算法
  • 服务器应用对头部和载荷再次以同样方法签名之后发现,自己计算出来的签名和接受到的签名不一样,说明这个Token的内容被别人动过的,我们应该拒绝这个Token,返回一个HTTP 401 Unauthorized响应
  • 在JWT中,不应该在载荷里面加入任何敏感的数据,比如用户的密码

如何应用

  • 一般是在请求头里加入Authorization,并加上Bearer标注

    fetch('api/user/1', { headers: {'Authorization': 'Bearer ' + token }})服务端会验证token
    如果验证通过,就会返回相应的资源
    

Golang 客户端实现

  • 调用包 https://github.com/tutengdihuang/jwt

  • 单例模式

var jwtIns *JwtAuthtype JwtAuth struct {Lock      *sync.Mutexalgorithm *jwt.AlgorithmclaimsMap map[string]*jwt.Claims //key: userID
}func GetJwtAuth() *JwtAuth {if jwtIns == nil {once := sync.Once{}once.Do(func() {if jwtIns == nil {jwtIns = new(JwtAuth)jwtIns.Lock = new(sync.Mutex)jwtIns.claimsMap = make(map[string]*jwt.Claims)secret := config_center.GetViperConf().Sub("jwt").GetString("secret")algorithm := jwt.HmacSha256(secret)jwtIns.algorithm = &algorithm}})}return jwtIns
}
  • get token
var jwtClaimUserKey = "username"
var jwtClaimUserIdKey = "id"func (this *JwtAuth) GetToken(userName string, id int) (token string, err error) {claim := jwt.NewClaim()claim.Set(jwtClaimUserKey, userName)claim.Set(jwtClaimUserIdKey, strconv.Itoa(id))//claim.SetTime("expire", time.Now().Add(30*time.Minute))idstr := strconv.Itoa(id)this.Lock.Lock()defer this.Lock.Unlock()this.claimsMap[idstr] = claimtoken, err = this.algorithm.Encode(claim)return
}
  • validate check
func (this *JwtAuth) Validate(idstr, token string) bool {this.Lock.Lock()defer this.Lock.Unlock()if _, ok := this.claimsMap[idstr]; !ok {return false}if this.algorithm.Validate(token) != nil {return false}return true
}
  • token decode
func (this *JwtAuth) TokenDecode(token string) (string, int, error) {claim, err := this.algorithm.Decode(token)if err != nil {return "", 0, err}userName, err := claim.Get(jwtClaimUserKey)if err != nil {return "", 0, err}idStr, err := claim.Get(jwtClaimUserIdKey)if err != nil {return "", 0, err}id, _ := strconv.Atoi(idStr)return userName, id, nil
}
  • token remove
func (this *JwtAuth) TokenRemove(id string) {this.Lock.Lock()defer this.Lock.Unlock()delete(this.claimsMap, id)
}
  • refer

Json web token (JWT) golang实现相关推荐

  1. JSON Web Token (JWT)生成Token及解密实战

    转载自 JSON Web Token (JWT)生成Token及解密实战 昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是J ...

  2. JSON Web Token (JWT),服务端信息传输安全解决方案

    转载自 JSON Web Token (JWT),服务端信息传输安全解决方案 JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对 ...

  3. php jwt token 解析,JSON Web Token(JWT)入坑详解

    JSON Web Token(JWT)入坑详解 龙行    PHP    2019-6-17    1651    0评论 /** JWT生成类 **/ class Jwt { private $al ...

  4. (json web token)JWT攻击

    前记 最近国赛+校赛遇到两次json web token的题,发现自己做的并不算顺畅,于是有了这篇学习文章. 为什么要使用Json Web Token Json Web Token简称jwt 顾名思义 ...

  5. jwttoken解码_使用 JSON WEB TOKEN (jwt) 验证

    一.什么JSON Web Tokens? JSON Web Tokens是一种开放的行业标准  RFC 7519方法,用于在双方之间安全地表示索赔. JWT.IO允许您解码,验证和生成JWT.其中.J ...

  6. JSON Web Token(JWT)对比Opaque Token

    身份验证通常用来验证某人或某事是否如它所说的那样是谁或者是什么. 身份验证技术通过测试查看用户的凭据是否与经过身份验证的用户数据库或服务器中的凭据相匹配,从而提供设备访问控制. 基于token的身份验 ...

  7. JSON Web Token (JWT)笔记(token实现单点登录功能)

    文章目录 前情提要 cookie(储存在用户本地终端上的数据) Cookie特点: session(web服务端内存) cookie和session 单点登录(只登录一次,可使用账号下全部服务)三种方 ...

  8. 用户登入身份验证,手机app登入身份验证,TokenAuth身份验证,JSON Web Token(JWT)身份验证

                                                                        JJWT身份验证 1.pom依赖: <dependency ...

  9. JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西

    JSON Web Token(缩写 JWT)是目前最流行,也是最常见的跨域认证解决方案.无论是咱们后端小伙伴,还是前端小伙伴对都是需要了解. 本文介绍它的原理.使用场景.用法. 关于封面:这个冬天你过 ...

最新文章

  1. java序列化的作用-这个挺有用的,不妨学学
  2. Nat. Commun | 基于网络的药物组合预测
  3. Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展...
  4. 皮一皮:现在想想真是幸运...
  5. 孙宇晨大战Vitalik
  6. js获取浏览器滚动条距离顶端的距离
  7. java商品信息管理系统代码_[源码分享]学生信息管理系统(管理员)
  8. tensorflow之cast
  9. Mysql授权root账户允许远程连接访问
  10. ffmpeg 录屏推流_在 Linux 使用 ffmpeg 推流
  11. QQ登陆界面Resource Hacker制作
  12. clion生成qt的qrc文件
  13. wind 债券数据 python_【Python学习】使用Wind接口分析同业存单的到期数据
  14. 银联网关支付 java版
  15. mysql主从配置详解_MySQL主从配置详解
  16. POSIX线程优先级设置
  17. 计算机低级格式化,硬盘格式化之低级格式化
  18. ims应用服务器,IMS业务应用服务器部署方式分析.PDF
  19. 一个筛选键引起电脑键盘失灵的命案
  20. 业务中台的困境、及可能的解

热门文章

  1. windows xp系统左下角音量图标不显示的一种解决办法
  2. ARMV8体系结构简介:AArch64应用级体系结构之Atomicity
  3. Unity (游戏UI模块的封装)
  4. 世界卫生组织与腾讯加深合作 新冠肺炎AI自查助手全球开源
  5. 在Linux上安装PintOS
  6. C++ 2048 编程 小游戏
  7. AD实用操作(二)- 导入CAD文件设置PCB板框
  8. sublime4禁止检查更新
  9. web前段开发(第五周)
  10. 第11章 项目人力资源管理