Node.js 使用 jsonwebtoken 模块
Node.js 教程
收录了这篇文章

简介

Node.js 的 JSON Web Token 模块有很多,我选择使用 jsonwebtoken。

项目地址: https://www.npmjs.com/package/jsonwebtoken

安装

npm install jsonwebtoken --save

用法

const jwt = require("jsonwebtoken")

const secret = "some word";

let payload = {};
payload.data = data || {};       //token 中包含的数据
payload.ctime = (new Date()).getTime(); //token的创建时间
payload.expiresIn = 1000*60*60*24*7;  //设定的过期时间

let token = jwt.sign(payload,secret);

函数

创建 JsonWebToken

jwt.sign(payload, secretOrPrivateKey, [options, callback])

(异步)如果提供回调,则使用err或JWT 调用回调。

(同步)将JsonWebToken返回为字符串。

payload必须是一个object, buffer或者string。请注意,exp只有当payload是object字面量时才可以设置。

secretOrPrivateKey 是包含HMAC算法的密钥或RSA和ECDSA的PEM编码私钥的string或buffer。

 

options:

algorithm:加密算法(默认值:HS256)
expiresIn:以秒表示或描述时间跨度zeit / ms的字符串。如60,"2 days","10h","7d",Expiration time,过期时间
notBefore:以秒表示或描述时间跨度zeit / ms的字符串。如:60,"2days","10h","7d"
audience:Audience,观众
issuer:Issuer,发行者
jwtid:JWT ID
subject:Subject,主题
noTimestamp
header

如果payload不是buffer或string,它将被强制转换为使用的字符串JSON.stringify()。

在expiresIn,notBefore,audience,subject,issuer没有默认值时。也可以直接在payload中用exp,nbf,aud,sub和iss分别表示,但是你不能在这两个地方同时设置。

 

请记住exp,nbf,iat是NumericDate类型。

生成的jwts通常会包含一个iat值除非指定了noTimestamp。如果iat插入payload中,则将使用它来代替实际的时间戳来计算其他事情,诸如options.expiresIn给定一个exp这样的时间间隔。

// sign with default (HMAC SHA256)
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');

//backdate a jwt 30 seconds
var older_token = jwt.sign({ foo: 'bar', iat: Math.floor(Date.now() / 1000) - 30 }, 'shhhhh');

// sign with RSA SHA256
var cert = fs.readFileSync('private.key'); // get private key
var token = jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256'});

 

Token Expiration (exp claim) 过期时间

// 签署1小时期限的token:
jwt.sign({
 exp: Math.floor(Date.now() / 1000) + (60 * 60),
 data: 'foobar'
}, 'secret');

使用此库生成令牌的另一种方法是:
jwt.sign({
 data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });

//or even better:
jwt.sign({
 data: 'foobar'
}, 'secret', { expiresIn: '1h' });

 

验证 JSON Web Token 的合法性

jwt.verify(token,secretOrPublicKey,[options,callback])

可以检验 JWT 的合法性,并获取 payload 中的内容。

// verify a token symmetric - synchronous
var decoded = jwt.verify(token, 'shhhhh');
console.log(decoded.foo) // bar

// verify a token symmetric
jwt.verify(token, 'shhhhh', function(err, decoded) {
  console.log(decoded.foo) // bar
});

// invalid token - synchronous
try {
  var decoded = jwt.verify(token, 'wrong-secret');
} catch(err) {
  // err
}

// invalid token
jwt.verify(token, 'wrong-secret', function(err, decoded) {
  // err
  // decoded undefined
});

// verify a token asymmetric
var cert = fs.readFileSync('public.pem');  // get public key
jwt.verify(token, cert, function(err, decoded) {
  console.log(decoded.foo) // bar
});

 

前后端存储位置

JWT token 通常存储在客户端里,可以存储在 Cookie 中,使用 HttpOnly 和 Secure 属性进行保护,避免 XSS 攻击和数据泄露,也可以存储在 LocalStorage 中,但需要对令牌进行加密和签名,避免受到 XSS 攻击和数据泄露的影响

 

参考:

https://github.com/auth0/node-jsonwebtoken#readme

https://segmentfault.com/a/1190000009494020

https://javascript.net.cn/article/570

修改时间 2024-09-27

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
JavaScript getter和setter
Debian11 安装笔记2:编译安装PHP
什么是 XSS 攻击
WordPress 插入文章函数 wp_insert_post()
Node.js 安装第三方模块
JavaScript 窗口/文档事件
HTML select 下拉列表
WordPress 常用的路径