原文:【JWT】JWT+HA256加密 Token验证

目录

  • Token验证
  • 传统的Token验证
  • JWT+HA256验证
回到顶部

Token验证

  最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。

回到顶部

传统的Token验证

  HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

  解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

  上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

  基于 Token 的身份验证方法

  使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
回到顶部

JWT+HA256验证

实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:

  • header
  • payload
  • signature

中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

Header

header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。

{"typ": "JWT","alg": "HS256"
}

上面的内容要用 Base64 的形式编码一下,所以就变成这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:

iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。

{"iss": "ninghao.net","exp": "1438955445","name": "wanghao","admin": true}

使用 Base64 编码以后就变成了这个样子:

eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ

Signature

JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

header
payload
secret

var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret');

处理完成以后看起来像这样:

SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。

【JWT】JWT+HA256加密 Token验证相关推荐

  1. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

  2. java不同项目加token访问_实战:你用SpringBoot集成JWT来实现一下token验证,可否?...

    作者:意识流 来源:www.jianshu.com/p/e88d3f8151db JWT官网:https://jwt.io JWT(Java版)的github地址:https://github.com ...

  3. 接口使用jwt返回token_JWT实现token验证

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSO ...

  4. Spring Boot+Spring Security+JWT 实现token验证

    Spring Boot+Spring Security+JWT 实现token验证 什么是JWT? JWT的工作流程 JWT的主要应用场景 JWT的结构 SpringBoot+Spring Secur ...

  5. go token验证_golang jwt+token验证的实现

    Token验证是验证用户身份的重要方式,在golang开发中具有广泛应用,文中主要阐述了利用jwt包加密后的token验证. 导入包: import ( "github.com/dgrija ...

  6. VUE+SpringBoot+JWT实现token验证,SSO单点登录

    Session的产生: 在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是什么?我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,htpp协议是无状态的,什 ...

  7. php oauth2 和 jwt,jwt-auth: thinkphp 的 jwt (JSON Web Token)身份验证扩展包,支持Swoole...

    JWT-AUTH thinkphp的jwt(JSON Web Token)身份验证包.支持Header.Cookie.Param等多种传参方式.包含:验证.验证并且自动刷新等多种中间件. 支持Swoo ...

  8. tp5 JWT生成token验证接口安全、防止高频请求

    1.composer安装 jwt composer require lcobucci/jwt 3.3 2.在extend/tools/jwt目录下创建Token.php文件 注意 extend目录下t ...

  9. 基于jwt的token验证、原理及流程

    来源:www.cnblogs.com/better-farther-world2099 一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JS ...

  10. SpringBoot + JWT token验证

    引入JWT依赖: <!--jwt--><dependency><groupId>io.jsonwebtoken</groupId><artifac ...

最新文章

  1. 高压缩比 压缩软件 linux,Linux下压缩软件对比
  2. bigdecimal正确用法_深入理解 BigDecimal 的使用
  3. git在已忽略文件夹中不忽略指定文件
  4. Pandas处理数据缺失值
  5. Android USB Host与HID通讯(二)
  6. 在不停止mysql复制主服务器的情况下,配置一个mysql复制从服务器
  7. Docker学习总结(40)——Docker常见应用场景再总结
  8. 华众 mysql_华众6.5虚拟主机管理系统SQL注入漏洞利用
  9. Mybatis分页查询(通过SQL分页实现)
  10. 四叉树(QuadTree)原理
  11. 计算机两个账户共享文件,两台电脑如何共享文件,简简单单六步即可实现文件共享...
  12. 电路与电子技术课程设计报告(正弦、方波-三角波、可调矩形波、可调锯齿波发生器)
  13. jQuery实现手机号码的验证
  14. 二叉树前序遍历--递归
  15. 计算机辅助仿真模拟的英文缩写,全国计算机等级考试二级MS Office
  16. 网络营销和传统营销有那些优劣势?
  17. 数字孪生电网解决方案助力智慧电网体系建设
  18. 使用CSS3动画实现文字滚动
  19. HIVE自定义UDF函数-经纬度转换成省市地址
  20. 如何使用ttf字体文件

热门文章

  1. SQL 查询CET使用领悟
  2. 【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点...
  3. 巴巴运动网学习笔记(51-55)
  4. 易语言-数据类型及其长度
  5. HTML,CSS基础十大重点问题
  6. Java 基础总结--反射的基本操作
  7. 使用DbFunctions来解决EF按照日期分组数据
  8. richtextbox 调用 selectAll() 之后执行Ctrl+C抛异常
  9. android:textStyle 设置加粗并倾斜
  10. 几个清华和北邮学霸公众号,值得学习