@qelos/auth
Version:
Express Passport authentication service
51 lines (42 loc) • 1.46 kB
text/typescript
import logger from '../services/logger';
import User, { UserDocument, UserModel } from '../models/user';
import { verifyRefreshToken } from '../services/tokens';
export async function refreshToken(req, res) {
if (!req.headers.authorization) {
return res.status(401).end()
}
// get the last part from an authorization header string like "bearer token-value"
const token = req.headers.authorization.split(' ')[1]
const tenant = req.headers.tenant = req.headers.tenant || '0'
try {
const decoded = await verifyRefreshToken(token, tenant) as any;
const user: UserDocument & UserModel = await User.findOne({
_id: decoded.sub,
tenant: decoded.tenant
}).exec() as any
if (!user.tokens.some(token => token.tokenIdentifier === decoded.tokenIdentifier)) {
throw new Error('refresh token not valid')
}
user.tokens = user.tokens.filter(token => token.tokenIdentifier !== decoded.tokenIdentifier);
const newToken = user.getToken({
authType: 'oauth',
workspace: decoded.workspace ? { _id: decoded.workspace } : null
});
const refreshToken = user.getRefreshToken(newToken);
await user.save()
return res.json({
payload: {
user: {
email: user.email,
name: user.name,
roles: user.roles,
},
token: newToken,
refreshToken,
}
}).end()
} catch (e) {
logger.error(e);
res.status(401).end()
}
}