欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在node中使用jwt签发与验证token

程序员文章站 2022-08-10 15:12:47
1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。 token是在服务端产生的。如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端。 前端可以在每次请求的时候带上token证明自己的合法地位。如果t ......

1.什么是token

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

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

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

2.什么是jwt

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

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

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

 

{
  "alg": "hs256", // 算法
  "typ": "jwt" // 类型
}

 

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

{
    iss (issuer):签发人
    exp (expiration time):过期时间
    sub (subject):主题
    aud (audience):受众
    nbf (not before):生效时间
    iat (issued at):签发时间
    jti (jwt id):编号   
}

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

{
  "sub": "1234567890",
  "name": "john doe",
  "admin": true
}

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

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

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

hmacsha256(
  base64urlencode(header) + "." +
  base64urlencode(payload),
  secret)

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

 

3.使用node签发token

首先需要下载jwt的依赖包

npm install jsonwebtoken

然后在文件中使用

var jwt = require('jsonwebtoken')
const payload = {
          name: 'boom'
        }
const secret = 'jqread'
const token = jwt.sign(payload, secret)  // 签发
console.log(token)

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

4.使用node验证token

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

  const guesttoken = getstorage('token')
    if (guesttoken) {
      config.headers['x-guesttoken'] = guesttoken
    }

然后再后台验证token

var token = req.headers['x-guesttoken']
const secret = 'jqread' // secret要与签发时一致
jwt.verify(token, secret, (err, decoded) => {
        if(err){
           console.log(err)
           return
        }
        console.log(decoded)
}

验证失败会打印出 invalid signature

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

 

参考资料:

jwt.io:;

jwt:json web token - 宁浩网:;

json web token 入门教程: