File: /var/dev/nowruzgan/rest/api/controllers/user/auth-id-cb.js
const jwt = require('jsonwebtoken');
const uuid = require('uuid');
const fs = require('fs').promises;
module.exports = {
friendlyName: 'Auth-ID-Callback',
inputs: {
redirect: {
type: 'string',
required: false
},
token: {
type: 'string',
required: true
},
},
exits: {
dbError: { statusCode: 500 },
success: {responseType: 'redirect'},
},
fn: async function (inputs, exits) {
let action = 'user.auth-id-callback';
sails.log.info({session: null, action, message: `Auth callback from id.nowruzgan.com.`});
let callback = sails.config.custom.id.callback;
let publicKey = await fs.readFile(`${global.appRoot}/cert/id.nowruzgan.com-public.pem`)
.catch(error => sails.log.error({session: null, action, message: `on reading id.nowruzgan.com public key`, error}) && false);
if(!publicKey)
return exits.dbError();
publicKey = publicKey.toString();
let userInfo;
try {
userInfo = jwt.verify(inputs.token, publicKey);
}catch(e) {
return exits.dbError();
}
let user = await User.findOne({email: userInfo.email}).populate('roles')
.intercept(sails.log.interceptError(null, action, `on finding user with sub: ${userInfo.sub}`, 'dbError'));
if(!user){
user = await User.create({
email: userInfo.email,
firstName: userInfo.firstName,
lastName: userInfo.lastName,
}).fetch()
.intercept(sails.log.interceptError(null, action, `on creating user for ${userInfo.email}`, 'dbError'));
sails.log.info({session: null, action, message: `User ${userInfo.email} <${userInfo.firstName}-${userInfo.lastName}> created`});
}
let token = uuid();
let sessionData = {
publicUser: User.getPublic(user),
user: user,
token: token,
iat: userInfo.iat,
exp: userInfo.exp,
timestamp: (new Date()).valueOf()
};
await sails.helpers.cache.with({action: 'set', key: `${token}:session`, value: sessionData});
if(inputs.redirect)
exits.success(`${inputs.redirect}#token=${token}`);
else
exits.success(callback.replace('__TOKEN__', token));
}
};