node使用JSON Web Token (JWT)身份验证

2023-12-15 10:12:43


前言

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

JWT是由header(头部)payload(数据)signature(签名)三部分组成,中间用点分隔开,并且都会使用 Base64 编码。

本文使用了密钥文件,可先生成相关秘钥数据(参考node加密集合(前端加密、后台解密)


一、安装依赖

npm install jsonwebtoken -S
and if use TS
npm install @types/jsonwebtoken -D

二、使用

1、默认同步签名(HMAC SHA256<**>HS256)对称秘钥

生成对称私钥

import { generateKeyPairSync } from 'crypto'

const { privateKey } = generateKeyPairSync('rsa', {
    modulusLength: 1024, // 
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
        cipher: 'aes-256-cbc',
        passphrase: 'top secret',
    }
});

token加解密

const privateKey = 'admin-node-ts' // 自定义密码或者使用上述生成的对称私钥

// 加密
import jwt from 'jsonwebtoken';
var token = jwt.sign({ foo: 'bar' }, privateKey);
console.log('encoded', token)

// 解密
var decoded = jwt.verify(token, privateKey);
console.log('decoded', decoded)

2、同步签名(RSA SHA256<**>RS256)非对称秘钥(推荐)

secretOrPrivateKey has a minimum key size of 2048 bits for RS256

import { generateKeyPairSync } from 'crypto'

const { privateKey } = generateKeyPairSync('rsa', {
    modulusLength: 2048,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
    }
});

// 加密
import jwt from 'jsonwebtoken';
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' });
console.log('encoded', token)

// 解密
var decoded = jwt.verify(token, privateKey, { algorithms: ['RS256'] });
console.log('decoded', decoded)

3、其他

时间有限~

算法类型
HS256HS256(使用SHA-256的HMAC)是一种对称密钥的散列算法
HS384-
HS512-
RS256RS256算法是一种非对称算法,使用私钥来签署JWT,使用公钥来验证该签名。 在签署你的JWT时,RS256是推荐的算法。 它更安全,而且如果钥匙被破坏,你可以快速地旋转钥匙。 (Auth0默认使用RS256来签署JWT)
RS384-
RS512-
ES256-
ES384-
ES512-
PS256-
PS384-
PS512-
none-

三、设置时间

回溯时间

设置数据中添加iat字段,用于设置回溯时间

import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
const iat= Math.floor(Date.now() / 1000) - 60; // 回溯前60s
var token = jwt.sign({ foo: 'bar', iat }, PRIVATE_KEY.toString(), { algorithm: 'RS256' });

过期时间

  • 设置数据中添加exp字段,用于设置失效时间
import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
const exp = Math.floor(Date.now() / 1000) + 60; // 60s 失效
var token = jwt.sign({ foo: 'bar', exp }, PRIVATE_KEY.toString(), { algorithm: 'RS256' });
  • expiresIn
import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
var token = jwt.sign({ foo: 'bar' }, PRIVATE_KEY.toString(), { algorithm: 'RS256', expiresIn: 60 * 60 }); // 推荐
or
var token = jwt.sign({ foo: 'bar' }, PRIVATE_KEY.toString(), { algorithm: 'RS256', expiresIn: '1h' }); // 优先推荐

一般有以下单位
s=秒
m=分
h=时
d=天
其他可使用ms进行转换使用


如有启发,可点赞收藏哟~

文章来源:https://blog.csdn.net/weiCong_Ling/article/details/134991257
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。