美文网首页
jsonwebtoken介绍和使用对称加密颁发验证token

jsonwebtoken介绍和使用对称加密颁发验证token

作者: 静昕妈妈芦培培 | 来源:发表于2021-03-17 12:19 被阅读0次
image.png
image.png

使用JWT生成的token由三个部分构成: header payload signature,例如:


image.png

jsonwebtoken

网址:https://www.npmjs.com/package/jsonwebtoken
JSON Web令牌的实现。
这是针对开发的draft-ietf-oauth-json-web-token-08。它利用了node-jws

安装

npm install jsonwebtoken

用法

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

颁发token
(异步)如果提供了回调,则使用err或JWT调用该回调。
(同步)以字符串形式返回JsonWebToken

payload 可以是对象文字,缓冲区或表示有效JSON的字符串。

注意,** exp或仅在有效载荷是对象文字的情况下才设置任何其他声明。不检查缓冲区或字符串有效负载的JSON有效性。

如果payload不是缓冲区或字符串,则使用将其强制为字符串JSON.stringify

secretOrPrivateKey是一个字符串,缓冲区或对象,其中包含HMAC算法的秘密或RSA和ECDSA的PEM编码的私钥。如果使用带有密码短语的私钥,{ key, passphrase }则可以使用一个对象(基于加密文档),在这种情况下,请确保您通过了该algorithm选项。
options

  • algorithm(默认值:HS256

  • expiresIn:以秒或表示时间跨度zeit / ms的字符串表示。

    如:60"2 days""10h""7d"。数值解释为秒计数。如果您使用字符串,请确保提供时间单位(天,小时等),否则默认使用毫秒单位("120"等于"120ms")。

带有默认值的同步符号(HMAC SHA256)

var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');

使用用RSA SHA256同步签名

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

异步签名

jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' }, function(err, token) {
  console.log(token);
});

回溯jwt 30秒

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

令牌到期

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

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

验证token
(异步)如果提供了回调,则函数将异步操作。如果签名有效且可选的有效期,受众或发行者有效,则使用解码后的有效负载调用回调。如果没有,它将被错误调用。

(同步)如果未提供回调,则函数将同步执行。如果签名有效且可选的有效期限,受众或发行者有效,则返回解码后的有效负载。如果没有,它将抛出错误。

token 是JsonWebToken字符串

secretOrPublicKey是一个字符串或缓冲区,其中包含HMAC算法的机密,或包含RSA和ECDSA的PEM编码的公钥。如果jwt.verify称为异步,则secretOrPublicKey可以是应该获取秘密或公共密钥的函数。请参阅下面的详细示例

本注释所述,还有其他库期望使用base64编码的机密(使用base64编码的随机字节),如果可以的话,您可以通过Buffer.from(secret, 'base64')这样做,机密将使用base64进行解码,并且令牌验证将使用原始库。随机字节。

options

  • algorithms:带有允许的算法名称的字符串列表。例如,["HS256", "HS384"]

  • maxAge:令牌允许的最长有效期限仍然有效。它以秒或描述时间跨度zeit / ms的字符串表示。

    如:1000"2 days""10h""7d"。数值解释为秒计数。如果您使用字符串,请确保提供时间单位(天,小时等),否则默认使用毫秒单位("120"等于"120ms")。

 // 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
});
 

支持的算法

支持的算法数组。当前支持以下算法。

alg参数值 数字签名或MAC算法
HS256 使用SHA-256哈希算法的HMAC
HS384 使用SHA-384哈希算法的HMAC
HS512 使用SHA-512哈希算法的HMAC
RS256 使用SHA-256哈希算法的RSASSA-PKCS1-v1_5
RS384 使用SHA-384哈希算法的RSASSA-PKCS1-v1_5
RS512 使用SHA-512哈希算法的RSASSA-PKCS1-v1_5
PS256 使用SHA-256哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0)
PS384 使用SHA-384哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0)
PS512 使用SHA-512哈希算法的RSASSA-PSS(仅节点^ 6.12.0 OR> = 8.0.0)
ES256 使用P-256曲线和SHA-256哈希算法的ECDSA
ES384 使用P-384曲线和SHA-384哈希算法的ECDSA
ES512 使用P-521曲线和SHA-512哈希算法的ECDSA
没有 不包含数字签名或MAC值

例:颁发token和验证token

const Koa = require('koa')
const Router = require('koa-router')
const jwt = require('jsonwebtoken')

const app = new Koa()

const testRouter = new Router()

//设置一个密钥
const SECRETKEKY = '123321abc'
// 登录接口
testRouter.post('/test', (ctx, next) => {
    //下面时获取到的用户信息
    const user = {id: 110, name: 'why'}

    //颁发token
    const token = jwt.sign(user, SECRETKEKY, {
        expiresIn: 10, //token过期时间,单位为s
    } )

    //响应数据
    ctx.body = token
})

//验证接口
testRouter.get('/demo', (ctx, next) => {
    //颁发token
    const authorization = ctx.headers.authorization
    const token = authorization.replace('Bearer ','')
    console.log(token)

    //验证token
    try{
        const result = jwt.verify(token, SECRETKEKY)
        ctx.body = result
    }catch(e) {
        ctx.boy = '无效的token'
    }
    
})

app.use(testRouter.routes())
app.use(testRouter.allowedMethods())

app.listen(8000, () => {
    console.log('服务器启动成功')
})
image.png

相关文章

网友评论

      本文标题:jsonwebtoken介绍和使用对称加密颁发验证token

      本文链接:https://www.haomeiwen.com/subject/sdpscltx.html