user redis

This commit is contained in:
2020-04-12 19:19:36 -04:00
parent 64444a6d32
commit ab108ebec8
11 changed files with 728 additions and 11 deletions

0
nodejs/models/auth.js → nodejs/models/auth_pam.js Executable file → Normal file
View File

55
nodejs/models/auth_red.js Normal file
View File

@ -0,0 +1,55 @@
const {promisify} = require('util');
const pam = require('authenticate-pam');
const authenticate = promisify(pam.authenticate);
const {User} = require('./user');
const {Token, AuthToken} = require('./token');
Auth = {}
Auth.errors = {}
Auth.errors.login = function(){
let error = new Error('PamLoginFailed');
error.name = 'PamLoginFailed';
error.message = `Invalid Credentials, login failed.`;
error.status = 401;
return error;
}
Auth.login = async function(data){
try{
let auth = await authenticate(data.username, data.password);
let user = await User.get(data);
let token = await AuthToken.add(user);
return {user, token}
}catch(error){
if (error == 'Authentication failure'){
throw this.errors.login()
}
throw error;
}
};
Auth.checkToken = async function(data){
try{
let token = await AuthToken.get(data);
if(token.is_valid){
return await User.get(token.created_by);
}
}catch(error){
throw this.errors.login();
}
};
Auth.logOut = async function(data){
try{
let token = await AuthToken.get(data);
await token.remove();
}catch(error){
throw error;
}
}
module.exports = {Auth, AuthToken};

View File

@ -0,0 +1,62 @@
'use strict';
const bcrypt = require('bcrypt');
const saltRounds = 10;
const {User} = require('./user_redis');
const {Token, AuthToken} = require('./token');
var Auth = {}
Auth.errors = {}
Auth.errors.login = function(){
let error = new Error('ResisLoginFailed');
error.name = 'RedisLoginFailed';
error.message = `Invalid Credentials, login failed.`;
error.status = 401;
return error;
}
Auth.login = async function(data){
try{
let user = await User.get(data);
let auth = await bcrypt.compare(data.password, user.password);
if(auth){
let token = await AuthToken.add(user);
return {user, token}
}else{
throw this.errors.login();
}
}catch(error){
if (error == 'Authentication failure'){
throw this.errors.login()
}
throw error;
}
};
Auth.checkToken = async function(data){
try{
let token = await AuthToken.get(data);
if(token.is_valid){
return await User.get(token.created_by);
}
}catch(error){
throw this.errors.login();
}
};
Auth.logOut = async function(data){
try{
let token = await AuthToken.get(data);
await token.remove();
}catch(error){
throw error;
}
}
module.exports = {Auth, AuthToken};

View File

@ -1,6 +1,6 @@
'use strict';
const Host = require('../utils/redis_model')({
const Host = new require('../utils/redis_model')({
_name: 'host',
_key: 'host',
_keyMap: {

0
nodejs/models/user.js → nodejs/models/user_pam.js Executable file → Normal file
View File

100
nodejs/models/user_redis.js Normal file
View File

@ -0,0 +1,100 @@
'use strict';
const objValidate = require('../utils/object_validate');
const {Token, InviteToken} = require('./token');
const bcrypt = require('bcrypt');
const saltRounds = 10;
const User = require('../utils/redis_model')({
_name: 'user',
_key: 'username',
_keyMap: {
'created_by': {isRequired: true, type: 'string', min: 3, max: 500},
'created_on': {default: function(){return (new Date).getTime()}},
'updated_by': {default:"__NONE__", isRequired: false, type: 'string',},
'updated_on': {default: function(){return (new Date).getTime()}, always: true},
'username': {isRequired: true, type: 'string', min: 3, max: 500},
'password': {isRequired: true, type: 'string', min: 3, max: 500},
'backing': {default:"redis", isRequired: false, type: 'string',},
}
});
User.add = async function(data) {
try{
data['password'] = await bcrypt.hash(data['password'], saltRounds);
data['backing'] = data['backing'] || 'redis';
return this.__proto__.add(data);
}catch(error){
throw error;
}
};
User.addByInvite = async function(data){
try{
let token = await InviteToken.get(data.token);
if(!token.is_valid){
let error = new Error('Token Invalid');
error.name = 'Token Invalid';
error.message = `Token is not valid or as allready been used. ${data.token}`;
error.status = 401;
throw error;
}
let user = await this.add(data);
if(user){
await token.consume({claimed_by: user.username});
return user;
}
}catch(error){
throw error;
}
};
User.setPassword = async function(data){
try{
data['password'] = await bcrypt.hash(data['password'], saltRounds);
return this.__proto__.update(data);
}catch(error){
throw error;
}
};
User.invite = async function(){
try{
let token = await InviteToken.add({created_by: this.username});
return token;
}catch(error){
throw error;
}
};
module.exports = {User};
(async function(){
try{
await User.get('proxyadmin1');
console.info('proxyadmin1 user exists');
}catch(error){
try{
let user = await User.add({
username:'proxyadmin1',
password: 'proxyadmin1',
created_by:'proxyadmin1'
});
console.log('proxyadmin1 created', user);
}catch(error){
console.error(error)
}
}
})();