@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
68 lines (59 loc) • 1.35 kB
text/typescript
import * as express from 'express';
import { verifyToken } from './verifyToken';
import { Auth } from '@aimee-blue/ab-contracts';
async function verifyTokenForRequest(
allow: Auth.Role[],
req?: express.Request
) {
// For safety purpose check anyway
// tslint:disable-next-line
if (!req || !req.headers) {
return null;
}
const authorization = req.headers.authorization;
if (!authorization) {
return null;
}
const match = authorization.match(/^Bearer (.*)$/);
if (!match) {
return null;
}
const token = match[1];
return await verifyToken({
token,
allow,
});
}
export const expressWithAuth = (allow: Auth.Role[]): express.Handler => (
req,
res,
next
) => {
verifyTokenForRequest(allow, req)
.then(result => {
if (!result) {
res.set('Connection', 'close');
res.status(401).json({
error: {
status: 'unauthorized',
message: 'Unauthorized',
},
});
res.end();
return;
}
if (result.status !== 200) {
res.set('Connection', 'close');
res.status(404).json({
error: {
status: 'not-found',
message: 'Not found',
},
});
res.end();
return;
}
next(undefined);
})
.catch(err => next(err));
};