You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.1 KiB
153 lines
4.1 KiB
3 years ago
|
'use strict'
|
||
|
|
||
|
const test = require('tap').test
|
||
|
const Fastify = require('fastify')
|
||
|
const jwt = require('../jwt')
|
||
|
|
||
|
test('Unable to add the namespace twice', function (t) {
|
||
|
t.plan(1)
|
||
|
const fastify = Fastify()
|
||
|
fastify.register(jwt, { secret: 'test', namespace: 'security', jwtVerify: 'securityVerify', jwtSign: 'securitySign' })
|
||
|
fastify.register(jwt, { secret: 'hello', namespace: 'security', jwtVerify: 'secureVerify', jwtSign: 'secureSign' })
|
||
|
.ready(function (err) {
|
||
|
t.equal(err.message, 'JWT namespace already used "security"')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('multiple namespace', async function (t) {
|
||
|
const fastify = Fastify()
|
||
|
fastify.register(jwt, { namespace: 'aaa', secret: 'test', verify: { extractToken: (request) => request.headers.customauthheader }, jwtDecode: true })
|
||
|
fastify.register(jwt, { namespace: 'bbb', secret: 'sea', verify: { extractToken: (request) => request.headers.customauthheader }, jwtVerify: 'verifyCustom', jwtSign: 'signCustom', jwtDecode: 'decodeCustom' })
|
||
|
fastify.register(jwt, { namespace: 'ccc', secret: 'tset', verify: { extractToken: (request) => request.headers.customauthheader } })
|
||
|
|
||
|
fastify.post('/sign/:namespace', async function (request, reply) {
|
||
|
switch (request.params.namespace) {
|
||
|
case 'aaa':
|
||
|
return reply.aaaJwtSign(request.body)
|
||
|
case 'ccc':
|
||
|
return reply.cccJwtSign(request.body)
|
||
|
default:
|
||
|
return reply.signCustom(request.body)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
fastify.get('/verify/:namespace', async function (request, reply) {
|
||
|
switch (request.params.namespace) {
|
||
|
case 'aaa':
|
||
|
return request.aaaJwtVerify()
|
||
|
default:
|
||
|
return request.verifyCustom()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
fastify.get('/decode/:namespace', async function (request, reply) {
|
||
|
switch (request.params.namespace) {
|
||
|
case 'aaa':
|
||
|
return request.jwtDecode()
|
||
|
case 'bbb':
|
||
|
return request.decodeCustom()
|
||
|
case 'ccc':
|
||
|
return request.cccJwtDecode()
|
||
|
default:
|
||
|
reply.code(501).send({ message: `Namespace ${request.params.namespace} is not implemented correctly` })
|
||
|
}
|
||
|
})
|
||
|
|
||
|
await fastify.ready()
|
||
|
|
||
|
let signResponse
|
||
|
let verifyResponse
|
||
|
|
||
|
signResponse = await fastify.inject({
|
||
|
method: 'post',
|
||
|
url: '/sign/aaa',
|
||
|
payload: { foo: 'bar' }
|
||
|
})
|
||
|
const tokenA = signResponse.payload
|
||
|
t.ok(tokenA)
|
||
|
|
||
|
verifyResponse = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/verify/aaa',
|
||
|
headers: {
|
||
|
customauthheader: tokenA
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponse.statusCode, 200)
|
||
|
t.match(verifyResponse.json(), { foo: 'bar' })
|
||
|
|
||
|
verifyResponse = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/verify/bbb',
|
||
|
headers: {
|
||
|
customauthheader: tokenA
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponse.statusCode, 401)
|
||
|
|
||
|
signResponse = await fastify.inject({
|
||
|
method: 'post',
|
||
|
url: '/sign/bbb',
|
||
|
payload: { foo: 'sky' }
|
||
|
})
|
||
|
const tokenB = signResponse.payload
|
||
|
t.ok(tokenB)
|
||
|
|
||
|
signResponse = await fastify.inject({
|
||
|
method: 'post',
|
||
|
url: '/sign/ccc',
|
||
|
payload: { foo: 'tset' }
|
||
|
})
|
||
|
const tokenC = signResponse.payload
|
||
|
t.ok(tokenC)
|
||
|
|
||
|
verifyResponse = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/verify/bbb',
|
||
|
headers: {
|
||
|
customauthheader: tokenB
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponse.statusCode, 200)
|
||
|
t.match(verifyResponse.json(), { foo: 'sky' })
|
||
|
|
||
|
verifyResponse = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/verify/aaa',
|
||
|
headers: {
|
||
|
customauthheader: tokenB
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponse.statusCode, 401)
|
||
|
|
||
|
const decodeResponseAAA = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/decode/aaa',
|
||
|
headers: {
|
||
|
customauthheader: tokenA
|
||
|
}
|
||
|
})
|
||
|
t.equal(decodeResponseAAA.statusCode, 200)
|
||
|
t.match(decodeResponseAAA.json(), { foo: 'bar' })
|
||
|
|
||
|
const verifyResponseBBB = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/decode/bbb',
|
||
|
headers: {
|
||
|
customauthheader: tokenB
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponseBBB.statusCode, 200)
|
||
|
t.match(verifyResponseBBB.json(), { foo: 'sky' })
|
||
|
|
||
|
const verifyResponseCCC = await fastify.inject({
|
||
|
method: 'get',
|
||
|
url: '/decode/ccc',
|
||
|
headers: {
|
||
|
customauthheader: tokenC
|
||
|
}
|
||
|
})
|
||
|
t.equal(verifyResponseCCC.statusCode, 200)
|
||
|
t.match(verifyResponseCCC.json(), { foo: 'tset' })
|
||
|
})
|