经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
在node中使用jwt签发与验证token的方法
来源:jb51  时间:2019/4/3 18:13:40  对本文有异议

1.什么是token

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

token是在服务端产生的。如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端。

前端可以在每次请求的时候带上token证明自己的合法地位。如果token在服务端持久化,那他就是一个永久的身份令牌。

2.什么是jwt

jwt,即JSON Web Token的缩写,是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息。

jwt由三个部分组成,它们之间用.分开,通常如下所示xxxxx.yyyyy.zzzzz,

第一个部分为Header,由两部分组成,类型和算法,例如

  1. {
  2. "alg": "HS256", // 算法
  3. "typ": "JWT" // 类型
  4. }

第二个部分为Payload,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。例如:

  1. {
  2. iss (issuer):签发人
  3. exp (expiration time):过期时间
  4. sub (subject):主题
  5. aud (audience):受众
  6. nbf (Not Before):生效时间
  7. iat (Issued At):签发时间
  8. jti (JWT ID):编号
  9. }

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

  1. {
  2. "sub": "1234567890",
  3. "name": "John Doe",
  4. "admin": true
  5. }

请注意,对于token,此信息虽然可以防止被篡改,但任何人都可以读取。除非加密,否则不要将秘密信息放在JWT的Payload或Header元素中。

第三部分为Signature,Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

  1. HMACSHA256(
  2. base64UrlEncode(header) + "." +
  3. base64UrlEncode(payload),
  4. secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

3.使用node签发token

首先需要下载jwt的依赖包

npm install jsonwebtoken

然后在文件中使用

  1. var jwt = require('jsonwebtoken')
  2. const payload = {
  3. name: 'boom'
  4. }
  5. const secret = 'JQREAD'
  6. const token = jwt.sign(payload, secret) // 签发
  7. console.log(token)

jwt.sign(payload, secret) 就可以签发token了,然后返回给前端,前端将返回的token保存在localstorage里或sessionstorage里

4.使用node验证token

在用户完成登录获得token并保存后,此后每次请求后台把token放在请求头中,例如:

  1.   const guestToken = getStorage('token')
  2. if (guestToken) {
  3. config.headers['X-GuestToken'] = guestToken
  4. }

然后再后台验证token

  1. var token = req.headers['x-guesttoken']
  2. const secret = 'JQREAD' // secret要与签发时一致
  3. jwt.verify(token, secret, (err, decoded) => {
  4. if(err){
  5. console.log(err)
  6. return
  7. }
  8. console.log(decoded)
  9. }

验证失败会打印出 Invalid Signature

验证成功会打印签发时的payload数据,然后就可以继续进行操作,返回数据了。

总结

以上所述是小编给大家介绍的在node中使用jwt签发与验证token的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号