diff --git a/config.json.example b/config.json.example deleted file mode 100644 index 1fa157c1e562f3843ef2f44bf60e1793fbf9c1e7..0000000000000000000000000000000000000000 --- a/config.json.example +++ /dev/null @@ -1,157 +0,0 @@ -{ - "development": - { - "port": 3000, - "ip": "127.0.0.1", - "debug" : true, - "monetdb": { - "host": "simcaqdb3.c3sl.ufpr.br", - "port": 50000, - "dbname": "simcaq", - "user": "monetdb", - "password":"monetdb", - "nrConnections": "4" - }, - "cdn" : { - "url": "http://simcaqdb3.c3sl.ufpr.br:3000", - "download": "https://simcaqdev.c3sl.ufpr.br/download/" - }, - "mongodb" : { - "uri": "mongodb://localhost/dev_users" - }, - "monq": { - "uri": "mongodb://localhost/dev_monq" - }, - "default": { - "api": { - "version" : "v1" - }, - "lde": { - "url": "http://ldedev.c3sl.ufpr.br/#" - }, - "simcaq": { - "url": "http://simcaqdev.c3sl.ufpr.br/#" - } - }, - "email": { - "host": "SMTP.office365.com", - "port": 587, - "secureConnection": false, - "auth": { - "user": "dadoseducacionais@ufpr.br", - "pass": "COLOCAR_A_SENHA_AQUI" - }, - "tls": { - "ciphers": "SSLv3" - }, - "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>" - }, - "security": { - "tokenLife": 3600 - } - }, - "test": - { - "port": 3000, - "ip": "127.0.0.1", - "debug" : true, - "monetdb": { - "host": "simcaqdb3.c3sl.ufpr.br", - "port": 50000, - "dbname": "simcaq", - "user": "monetdb", - "password":"monetdb", - "nrConnections": "4" - }, - "cdn" : { - "url": "http://simcaqdb3.c3sl.ufpr.br:3000", - "download": "https://simcaqdev.c3sl.ufpr.br/download/" - }, - "mongodb" : { - "uri": "mongodb://localhost/test_users", - "secret": "SimCAQC3SL" - }, - "monq": { - "uri": "mongodb://localhost/test_monq" - }, - "default": { - "api": { - "version" : "v1" - }, - "lde": { - "url": "http://ldedev.c3sl.ufpr.br/#" - }, - "simcaq": { - "url": "http://simcaqdev.c3sl.ufpr.br/#" - } - }, - "email": { - "host": "SMTP.office365.com", - "port": 587, - "secureConnection": false, - "auth": { - "user": "dadoseducacionais@ufpr.br", - "pass": "COLOCAR_A_SENHA_AQUI" - }, - "tls": { - "ciphers": "SSLv3" - }, - "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>" - }, - "security": { - "tokenLife": 3600 - } - }, - "production": - { - "port": 3000, - "ip": "127.0.0.1", - "debug" : false, - "monetdb": { - "host": "simcaqdb3.c3sl.ufpr.br", - "port": 50000, - "dbname": "simcaq", - "user": "monetdb", - "password":"monetdb", - "nrConnections": "4" - }, - "cdn" : { - "url": "http://simcaqdb3.c3sl.ufpr.br:7000", - "download": "https://simcaq.c3sl.ufpr.br/download/" - }, - "mongodb" : { - "uri": "mongodb://localhost/users", - "secret": "SimCAQC3SL" - }, - "monq": { - "uri": "mongodb://localhost/monq" - }, - "default": { - "api": { - "version" : "v1" - }, - "lde": { - "url": "http://lde.c3sl.ufpr.br/#" - }, - "simcaq": { - "url": "http://simcaq.c3sl.ufpr.br/#" - } - }, - "email": { - "host": "SMTP.office365.com", - "port": 587, - "secureConnection": false, - "auth": { - "user": "dadoseducacionais@ufpr.br", - "pass": "COLOCAR_A_SENHA_AQUI" - }, - "tls": { - "ciphers": "SSLv3" - }, - "from": "\"Laboratório de Dados Educacionais\" <dadoseducacionais@ufpr.br>" - }, - "security": { - "tokenLife": 3600 - } - } -} diff --git a/script_req.sh b/script_req.sh new file mode 100755 index 0000000000000000000000000000000000000000..125204b86fb256e0608e25f161dccddb4cbc1ddc --- /dev/null +++ b/script_req.sh @@ -0,0 +1,10 @@ +curl -X 'POST' \ + 'http://10.254.221.20:3000/api/v1//auth/token' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "email": "eduardomsouza@ufpr.br", + "password": "teste123", + "client_secret": "LDE", + "grant_type": "password" +}' \ No newline at end of file diff --git a/src/libs/app.js b/src/libs/app.js index 9731038ac544b4c1f56a163104e0b8a7f5838f75..bab5e52d57d27260c16c60719855c60f4be71255 100644 --- a/src/libs/app.js +++ b/src/libs/app.js @@ -19,10 +19,6 @@ const api_v2 = require('./routes_v2/api'); const passport = require('passport'); -const postgres = require(`${libs}/db/postgres`); - -const db = mongoose(); - require(`${libs}/middlewares/passport`); app.use(bodyParser.json({limit: '50mb'})); diff --git a/src/libs/db/postgres.js b/src/libs/db/postgres.js index 58c6d59ecb6b89e4f676ea85a0cd0bf6b9e62536..c60d28c6932491dbee5ba88a5f86412d707cda23 100644 --- a/src/libs/db/postgres.js +++ b/src/libs/db/postgres.js @@ -1,21 +1,8 @@ -const libs = `${process.cwd()}/libs`; +const Sequelize = require('sequelize'); -const config = require(`${libs}/config`); +// if you are using postgres, your DB URL will look like this +const DATABASE_URL = 'postgres://postgres:postgres@localhost:5432/postgres' -const log = require(`${libs}/log`)(module); +const db = new Sequelize(DATABASE_URL) -const { Pool} = require('pg'); - -module.exports = () => { - - const pool = new Pool({ - user: "postgres", - database: "postgres", - password: "postgres", - port: 5432, - host: "localhost", - - }); - - return pool; -}; +module.exports = db \ No newline at end of file diff --git a/src/libs/middlewares/oauth2.js b/src/libs/middlewares/oauth2.js index cc9a45ede4a3158bc055166202c6d20fb84a6dff..4cb6adcdb1ea2d905c56cfae85623e6023de3316 100644 --- a/src/libs/middlewares/oauth2.js +++ b/src/libs/middlewares/oauth2.js @@ -7,7 +7,6 @@ const libs = `${process.cwd()}/libs`; const config = require(`${libs}/config`); const log = require(`${libs}/log`)(module); -const db = require(`${libs}/db/mongoose`); const User = require(`${libs}/models/user`); const AccessToken = require(`${libs}/models/accessToken`); const RefreshToken = require(`${libs}/models/refreshToken`); @@ -88,7 +87,7 @@ aserver.exchange(oauth2orize.exchange.refreshToken((client, refreshToken, scope, return done(null, false); } - User.findById(token.userId, (err, user) => { + User.findOne({token: token.userId} , (err, user) => { if (err) { log.error(err); return done(err); diff --git a/src/libs/middlewares/passport.js b/src/libs/middlewares/passport.js index ab895a9604072e3b77a6384ac0c0f9066dcf6753..246a95ea550e2723cc0ccce1070436997ff871a3 100644 --- a/src/libs/middlewares/passport.js +++ b/src/libs/middlewares/passport.js @@ -50,7 +50,7 @@ passport.use(new BearerStrategy( (accessToken, done) => { return done(null, false, { msg: 'Token expired' }); } - User.findById(token.userId, function(err, usuario) { + User.findOne({token: token.userId}, function(err, usuario) { if (err) { return done(err); } diff --git a/src/libs/models/user.js b/src/libs/models/user.js index 4d40c4e26c518dacf10b9e55b64b83c0aeeeb622..04fcb892c346f9962014b41fa02660ce4eb13dcd 100644 --- a/src/libs/models/user.js +++ b/src/libs/models/user.js @@ -1,10 +1,16 @@ const Sequelize = require("sequelize"); const crypto = require('crypto') +const db = require('../db/postgres.js') const libs = `${process.cwd()}/libs`; const log = require(`${libs}/log`)(module); // set up a sequelize model -var User = sequelize.define("User",{ +var User = db.define("User",{ + id:{ + type: Sequelize.STRING, + allowNull:false, + unique: true + }, email: { type: Sequelize.STRING, allowNull: false, @@ -13,16 +19,28 @@ var User = sequelize.define("User",{ notNull: { msg: "O campo Email é obrigatório." }, } }, + password:{ + type: Sequelize.STRING, + get(){ + return () => this.getDataValue('password') + } + }, hashed_password:{ type: Sequelize.STRING, allowNull: false, validate: { notNull: { msg: "O campo Senha é obrigatório." }, + }, + get() { + return() => this.getDataValue('salt') } }, salt: { type: Sequelize.STRING, - allowNull: false + allowNull: false, + get() { + return() => this.getDataValue('salt') + } }, name:{ type: Sequelize.STRING, @@ -143,20 +161,39 @@ var User = sequelize.define("User",{ {} ); +User.generateSalt = function() { + return crypto.randomBytes(128).toString('hex'); +} + User.encryptPassword = function(password) { return crypto.pbkdf2Sync(password+'', this.salt, 10000, 512, 'sha512'); +} + +User.generateObjectId = function(){ + var timestamp = (new Date().getTime() / 1000 | 0).toString(16); + return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() { + return (Math.random() * 16 | 0).toString(16); + }).toLowerCase(); +} + +const setSaltAndPassword = user => { + if (user.changed('password')) { + user.salt = User.generateSalt() + user.password = User.encryptPassword(user.password()) + this.hashed_password = this.encryptPassword(password).toString('hex'); + } +} + +const setObjectId = user => { + user.id = User.generateObjectId() }; -User.virtual('password').set(function(password) { - this._plainPassword = password+''; - this.salt = crypto.randomBytes(128).toString('hex'); - this.hashed_password = this.encryptPassword(password).toString('hex'); -}).get(function() { - return this._plainPassword; -}); +User.beforeCreate(setSaltAndPassword) +User.beforeCreate(setObjectId) +User.beforeUpdate(setSaltAndPassword) -User.checkPassword = function(password) { - return this.encryptPassword(password).toString('hex') === this.hashed_password; +User.prototype.checkPassword = function(enteredPassword) { + return User.encryptPassword(enteredPassword, this.salt()) === this.hashed_password() } module.exports = User; diff --git a/src/libs/models/verificationToken.js b/src/libs/models/verificationToken.js index ef7e109e16364874ea7d3f4b07b6e19ce74c3eae..793ed56c86325afc0ba59f27446a33c1eb556c1f 100644 --- a/src/libs/models/verificationToken.js +++ b/src/libs/models/verificationToken.js @@ -1,33 +1,32 @@ -const mongoose = require('mongoose'); -const Schema = mongoose.Schema; -const libs = `${process.cwd()}/libs`; +const Sequelize = require("sequelize"); +const crypto = require('crypto') +const db = require('../db/postgres.js') const log = require(`${libs}/log`)(module); const User = require(`${libs}/models/user`); const uuid = require('node-uuid'); -let VerificationToken = new Schema({ +var VerificationToken = db.define("VerificationToken",{ userId: { - type: Schema.Types.ObjectId, - required: true, - ref: 'User' + type: Sequelize.STRING, + allowNull: false }, - token: { - type: String, - required: true + token:{ + type: Sequelize.STRING, + allowNull: false }, - verified: { - type: Boolean, - required: true, + verified:{ + type: Sequelize.BOOLEAN, + allowNull: false, default: false }, - createdAt: { - type: Date, - required: true, + createdAt:{ + type: Sequelize.DATE, + allowNull: false, default: Date.now } -}); +}) -VerificationToken.methods.createVerificationToken = function(done) { +VerificationToken.createVerificationToken = function(done) { let verificationToken = this; let token = uuid.v4(); verificationToken.set('token', token); @@ -38,4 +37,6 @@ VerificationToken.methods.createVerificationToken = function(done) { }) } -module.exports = mongoose.model('VerificationToken', VerificationToken); +VerificationToken.belongsTo(User); + +module.exports = VerificationToken; diff --git a/src/libs/routes_v1/resetToken.js b/src/libs/routes_v1/resetToken.js index 34ece8455adf7b77208dc200a95641ed04638609..faa4caa6de3bebeb9b92ad2394456d0b8bcae905 100644 --- a/src/libs/routes_v1/resetToken.js +++ b/src/libs/routes_v1/resetToken.js @@ -32,7 +32,7 @@ resetTokenApp.get('/:token', (req, res, next) => { }) return next({msg: 'Token expired', status: 410}); } - User.findById(rToken.userId, (err, user) => { + User.findOne({token: rToken.userId}, (err, user) => { if(err) { log.error(err); next(err); @@ -55,7 +55,7 @@ resetTokenApp.post('/:token', (req, res, next) => { res.statusCode = 404; return next({msg: 'Token not found', status:404}); } - User.findById(rToken.userId, (err, user) => { + User.findOne({token: rToken.userId}, (err, user) => { if(err) { log.error(err); next(err); diff --git a/src/libs/routes_v1/user.js b/src/libs/routes_v1/user.js index 7ff088eea62f34ffd3b66de4a28ae42807a97e8d..951717d72318e3093c51e14b484c74820d6befa3 100644 --- a/src/libs/routes_v1/user.js +++ b/src/libs/routes_v1/user.js @@ -100,7 +100,7 @@ userApp.get('/me', passport.authenticate('bearer', { session: false }), (req, re }, response('user')); userApp.get('/:id', (req, res, next) => { - User.findById(req.params.id, (err, user) => { + User.findOne({id: req.params.id}, (err, user) => { if(err) { log.error(err); return next(err); @@ -161,7 +161,7 @@ userApp.post('/', (req, res, next) => { // Create verification token let verificationToken = new VerificationToken({ - userId: user._id + userId: user.id }); verificationToken.createVerificationToken((err, token) => { @@ -195,7 +195,7 @@ userApp.post('/', (req, res, next) => { }); userApp.put('/:id', passport.authenticate('bearer', { session: false }), (req, res, next) => { - User.findById(req.params.id, (err, user) => { + User.findOne({id:req.params.id}, (err, user) => { if (err) { log.error(err); return next({err}); diff --git a/src/libs/routes_v1/verifyToken.js b/src/libs/routes_v1/verifyToken.js index d54f64aa162c767c765784398dbcab455a9d666e..ecb834b35931d648d29825791dbe92ee253014e6 100644 --- a/src/libs/routes_v1/verifyToken.js +++ b/src/libs/routes_v1/verifyToken.js @@ -22,7 +22,7 @@ verifyTokenApp.get('/:token', (req, res, next) => { res.statusCode = 404; return next({msg: 'Token not found', status:404}); } - User.findById(vToken.userId, (err, user) => { + User.findOne({token:vToken.userId}, (err, user) => { if(err) { log.error(err); next(err);