import jwt from 'jsonwebtoken' import { Role } from '../roles' class AuthError extends Error { constructor(message?) { super(message ? `Not authorized: ${message}` : 'Not authorized') } } export function signInToken({ userId, role }): string { return jwt.sign({ userId, role }, process.env.APP_SECRET) } function userTokenIsValid(token) { try { jwt.verify(token, process.env.APP_SECRET) return true } catch (error) { return false } } export function userIsSignin(ctx) { return userTokenIsValid(ctx.request.get('authorization')) } // Since we use default options (HS256), we receive an object as a response. We assume a valid token is passed. function getTokenData(token) { return jwt.verify(token, process.env.APP_SECRET) } function getFieldFromToken(authorization, fieldName) { const token = authorization.replace('Bearer ', '') try { const tokenData = getTokenData(token) return tokenData[fieldName] } catch (error) { throw new AuthError(error) } } export function getUserId(ctx) { return getFieldFromToken(ctx.request.get('Authorization'), 'userId') } export function getRole(ctx) { return getFieldFromToken(ctx.request.get('Authorization'), 'role') } export function getUserIdRest(req) { const { headers: { authorization }, } = req if (!authorization) throw new AuthError() return getFieldFromToken(authorization, 'userId') } /** * ADMIN */ export function getAdminToken() { return jwt.sign({ role: Role[Role.Admin] }, process.env.ADMIN_SECRET) } export function adminTokenIsValid(token) { try { jwt.verify(token, process.env.ADMIN_SECRET) return true } catch (error) { return false } } export function adminIsSignin(ctx) { return adminTokenIsValid(ctx.request.get('authorization')) } export const testables = { getFieldFromToken: getFieldFromToken, getTokenData: getTokenData, adminTokenIsValid: adminTokenIsValid, userTokenIsValid: userTokenIsValid, }