UNPKG

mgmt-iot-web

Version:

web platform to configure and interact with iot devices using mqtt

203 lines (176 loc) 5.23 kB
var jwt = require('jsonwebtoken'); var httpStatus = require('http-status-codes'); const { OAuth2Client } = require('google-auth-library'); // gauth var response = require('./response'); var config = require('../../config/env'); var User = require('../models/users'); var Client = require('../models/clients'); var Auth = require('../models/auth'); var Firmware = require('../models/firmwares'); function check_authentication(req, res, next) { Auth.check_authentication(req.session.token,(authenticated,user)=>{ if(user && user.agent == req.get('User-Agent') && user.ip==req.ip){ if(authenticated) { req.user = user; } } next() }); } function api_check_authentication(req, res, next) { if(req.headers.hasOwnProperty('token')){ Auth.check_token(req.headers['token'],(authenticated,user)=>{ if(authenticated) { req.user = user; next() }else{ res.status(401).json({ error: 'Unauthorized' }); } }) }else{ Auth.check_authentication(req.session.token,(authenticated,user)=>{ if(authenticated) { req.user = user; next() }else{ res.status(401).json({ error: 'Unauthorized' }); } }); } } function authenticate_email(req, res, next) { User.findUserByEmail(req.body.email,req.body.password,(err,result)=>{ if(err) res.json({message:"Failure"}); else if(result == null) res.json({message:"wrong credentials"}); else{ req.user = result; next(); } }); } function authenticate(req, res, next) { if(req.body.password == "") return res.json({message:"Failure"}); Client.get(req.body.user,req.body.password,(err,result)=>{ if(err) res.json({message:"Failure"}); else if(result == null) res.json({message:"User and password doesn't match"}); else{ req.user = result; next(); } }); } // web client async function authenticate_google(req,res,next){ let access_token = ""; if(req.query.token != null) access_token = req.query.token; else if(req.body.token != null) access_token = req.body.token; // clientId has to be the same that was used in front end app //const clientId = "72512997406-nbev1bnp4lhv9uauejrdsjni7ev1s7f3.apps.googleusercontent.com"; const clientId = config.googleClientId; const client = new OAuth2Client(clientId); try{ const ticket = await client.verifyIdToken({ idToken: access_token, audience: clientId }); const data = ticket.getPayload(); const userId = await User.getId(config.new_client.user_type); Client.findGoogleClient(data.email, (err,result)=>{ if(err) res.json({message:"Failure"}); else if(result == null){ // register user Client.registerGoogleClient(userId,data,(err,result)=>{ if(err){ console.log(err); res.json({message:"Failure"}); } else if(result == null) res.json({message:"Couldn't register user"}); else{ Client.findGoogleClient(data.email,(err,result)=>{ if(err) res.json({message:"Failure"}); else if(result == null) res.json({message:"Something went wrong during user registration"}); else{ req.user = result; next(); } }); } }); } else{ req.user = result; next(); } }); }catch(error){ log.warn("Google Unauthorized"); res.json({message:"Unauthorized"}); } } function deauth(req, res, cb) { req.session.token = null; cb(res,res); } function generateToken(req, res, next) { if (!req.user) return next(); const jwtPayload = { user_id : req.user.user_id, type: req.user.type, level: req.user.level, client_id : req.user.client_id, nick: req.user.nick, name: req.user.name, ip : req.ip, agent: req.get('User-Agent'), avatar: req.user.avatar, }; const jwtData = { expiresIn: config.jwtDuration, }; const secret = config.jwtSecret; req.session.token = jwt.sign(jwtPayload, secret, jwtData); //User.updateWsToken(req.user.client_id,req.session.token.substr(req.session.token.length-20,req.session.token.length),(error,res)=>{log.debug(error,res)}); next(); } function respondJWT(req, res) { if (!req.user) { res.status(401).json({ error: 'Unauthorized' }); } else { res.status(200).json({ message:"Success", token:req.session.token }); } } function fw_check_token(req,res,next){ let token = req.headers.token || req.query.token; if(token == null) response.error(res,httpStatus.BAD_REQUEST,"No token defined"); else{ Firmware.getFirmwareToken(token,req.params.fwId,(err,rows)=>{ if(err) response.error(res,httpStatus.INTERNAL_SERVER_ERROR,err); else if(rows == null || rows.length == 0) response.error(res,httpStatus.INTERNAL_SERVER_ERROR,"token not valid"); else next(); }) } } module.exports = { check_authentication, api_check_authentication, authenticate_email, authenticate, authenticate_google, deauth, generateToken, respondJWT, fw_check_token };