![](https://img.haomeiwen.com/i22765904/75fc6ab5aecd0161.png)
![](https://img.haomeiwen.com/i22765904/7b5fbd037b935a0f.png)
使用JWT生成的token由三个部分构成: header payload signature,例如:
![](https://img.haomeiwen.com/i22765904/2b21af0acd25ad78.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('服务器启动成功')
})
![](https://img.haomeiwen.com/i22765904/9d7518965f852ffa.png)
网友评论