1
0
Fork 0
auth.rxbn.de/bin/web/routes/api.js

217 lines
4.9 KiB
JavaScript
Raw Normal View History

2019-06-18 22:44:35 +00:00
/*
* This file is part of the authRXBN single sign-on package.
*
* (c) Ruben Meyer <contact@rxbn.de>
*/
var express = require('express');
var route = express.Router();
2019-11-30 23:56:33 +00:00
/**
* register a user; currently not implemented
* @url /register
* @method POST
*/
2019-06-18 22:44:35 +00:00
route.post('/register', (req, res) => {
2019-11-30 23:56:33 +00:00
// if registration is disabled
2019-06-18 22:44:35 +00:00
if(!global['app'].cfg.web.registration) {
return res.type('json').status(400).end(JSON.stringify({status: 400, message: "msg.auth.registration.deactivated"}));
2019-11-30 22:42:34 +00:00
} else {
2019-11-30 23:56:33 +00:00
// am i rite?
2019-11-30 22:42:34 +00:00
return res.type('json').status(200).end(JSON.stringify({}));
2019-06-18 22:44:35 +00:00
}
});
2019-11-30 23:56:33 +00:00
/**
* login a user
* @url /api/login
* @method POST
* @POST ['email', 'password']
* @TODO add new activity 'action.user.login'
*/
2019-06-18 22:44:35 +00:00
route.post('/login', (req, res) => {
2019-11-30 23:56:33 +00:00
// if user is logged in (existing session); FAIL
2019-11-23 23:37:01 +00:00
if(req.session.user) {
return res.type('json').end(JSON.stringify({
status: 401,
message: 'msg.auth.logout.required'
}));
}
// check body variables
2019-11-30 23:56:33 +00:00
if(!req.body.email || !req.body.password) {
2019-11-23 23:37:01 +00:00
return res.type('json').status(401).end(JSON.stringify({
status: 401,
message: [
'msg.request.data.missing',
'msg.auth.login.failed'
]
}));
}
let email = req.body.email;
let pass = req.body.password;
2019-11-30 23:56:33 +00:00
// database query: get user by email
2019-11-23 23:37:01 +00:00
global['modules'].database.getUser(email, (err, rep) => {
2019-11-30 23:56:33 +00:00
// if database error
2019-11-23 23:37:01 +00:00
if(err) {
2019-11-30 23:56:33 +00:00
// log error while debugging
2019-11-23 23:37:01 +00:00
global['logs'].debug(err);
2019-11-30 23:56:33 +00:00
// login failed because of database error
2019-11-23 23:37:01 +00:00
return res.type('json').status(500).end(JSON.stringify({
status: 500,
message: [
'msg.database.error',
'msg.auth.login.failed'
]
}));
}
2019-11-30 23:56:33 +00:00
// no reply (user does not exist) or password is wrong
2019-11-23 23:37:01 +00:00
if(!rep || rep === null || rep.length == 0 || rep.length > 1 || !global['modules'].auth.validateHash(rep[0].passhash, pass)) {
return res.type('json').status(401).end(JSON.stringify({
status: 401,
message: 'msg.auth.login.failed'
}));
2019-11-30 23:56:33 +00:00
// do login
2019-11-23 23:37:01 +00:00
} else {
// add cookies; login
// new activity 'action.user.login'
// add session data
req.session.user = {
'id': rep[0]._id,
'group': rep[0].group
};
return res.type('json').end(JSON.stringify({
status: 200,
message: 'msg.auth.login.successful',
type: 'form' // TODO: types - { form, access_app}
}));
}
});
2019-06-18 22:44:35 +00:00
});
2019-11-30 23:56:33 +00:00
/**
* apps verify token
* @url /api/authenticate
* @method POST
* @POST ['applicationId', 'applicationSecret', 'userId', 'token']
* @TODO add implementation
*/
2019-06-18 22:44:35 +00:00
route.post('/authenticate', (req, res) => {
// TODO: authenticate
});
2019-11-30 23:56:33 +00:00
/**
* redirect user to app
* @url /api/redirect
* @method GET
* @GET ['id']
*/
2019-11-30 22:42:34 +00:00
route.get('/redirect', (req, res) => {
2019-11-30 23:56:33 +00:00
// if user is logged in
2019-11-30 22:42:34 +00:00
if(req.session && req.session.user) {
2019-11-30 23:56:33 +00:00
// missing query data to retrieve app
2019-11-30 22:42:34 +00:00
if(!req.query || !req.query.id) {
return res.type('json').status(500).end(JSON.stringify({
status: 500,
message: [
'msg.request.data.missing'
]
}));
}
2019-11-30 23:56:33 +00:00
// set auth code
2019-11-30 22:42:34 +00:00
global['modules'].database.setAuthCode({
aId: req.query.id,
uId: req.session.user.id
}, (err, rep) => {
2019-11-30 23:56:33 +00:00
// database error
2019-11-30 22:42:34 +00:00
if(err) {
global['logs'].debug(err);
return res.type('json').status(500).end(JSON.stringify({
status: 500,
message: [
'msg.database.error'
]
}));
}
else if(rep) {
2019-11-30 23:56:33 +00:00
// retrieve apps
2019-11-30 22:42:34 +00:00
global['modules'].database.getApps((err2, rep2) => {
2019-11-30 23:56:33 +00:00
// database error
2019-11-30 22:42:34 +00:00
if(err2) {
global['logs'].debug(err2);
return res.type('json').status(500).end(JSON.stringify({
status: 500,
message: [
'msg.database.error'
]
}));
}
2019-11-30 23:56:33 +00:00
// for each app
2019-11-30 22:42:34 +00:00
rep2.forEach((app) => {
2019-11-30 23:56:33 +00:00
// if app.id is equal to queried app
2019-11-30 22:42:34 +00:00
if(app.id == req.query.id) {
2019-11-30 23:56:33 +00:00
// redirect to app
2019-11-30 22:42:34 +00:00
return res.redirect(app.access+"?uid="+req.session.user.id+"&token="+rep.token);
}
});
});
} else {
2019-11-30 23:56:33 +00:00
// database error
2019-11-30 22:42:34 +00:00
return res.type('json').status(500).end(JSON.stringify({
status: 500,
message: [
'msg.database.error'
]
}));
}
});
2019-11-30 23:56:33 +00:00
// user isnt logged in
2019-11-30 22:42:34 +00:00
} else {
return res.type('json').end(JSON.stringify({
status: 401,
message: 'msg.auth.login.required'
}));
}
});
2019-11-30 23:56:33 +00:00
/**
* logout user
* @url /api/logout
* @method GET
*/
2019-06-18 22:44:35 +00:00
route.get('/logout', (req, res) => {
2019-11-30 23:56:33 +00:00
// user needs to be logged in
2019-11-30 22:42:34 +00:00
if(!req.session || !req.session.user) {
2019-06-18 22:44:35 +00:00
return res.type('json').end(JSON.stringify({
status: 401,
message: 'msg.auth.login.required'
}));
2019-11-30 23:56:33 +00:00
// logout user
2019-06-18 22:44:35 +00:00
} else {
res.clearCookie('RememberMe');
req.session.destroy();
return res.type('json').end(JSON.stringify({
status: 200,
message: 'msg.auth.logout.successful'
}));
}
});
if(global['gds'].debug) {
// DEBUG info
route.get('/info', (req, res) => {
let obj = {};
if(req.session) obj.session = req.session;
if(req.cookies) obj.cookie = req.cookies;
res.type('json').end(JSON.stringify(obj));
});
}
module.exports = route;