From d2d6eb15af4f1160044b8ef3749b661e2d26a0e7 Mon Sep 17 00:00:00 2001 From: arahito Date: Wed, 26 Apr 2017 17:46:10 +0700 Subject: [PATCH 1/3] create auth-passport --- .gitignore | 2 + controllers/userController.js | 89 +++++++++++++++++++++++++++++++++++ helpers/check_token.js | 19 ++++++++ models/user.js | 20 ++++++++ package.json | 30 ++++++++++++ routes/index.js | 41 ++++++++++++++++ server.js | 23 +++++++++ 7 files changed, 224 insertions(+) create mode 100644 .gitignore create mode 100644 controllers/userController.js create mode 100644 helpers/check_token.js create mode 100644 models/user.js create mode 100644 package.json create mode 100644 routes/index.js create mode 100644 server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91dfed8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules \ No newline at end of file diff --git a/controllers/userController.js b/controllers/userController.js new file mode 100644 index 0000000..1cb216f --- /dev/null +++ b/controllers/userController.js @@ -0,0 +1,89 @@ +const mongo = require('mongodb') +const User = require('../models/user') +const passwordHash = require('password-hash') +const jwt = require('jsonwebtoken') +var methods = {} + +methods.insertOne = (req, res, next) => { + let pwdHash = req.body.password + User.create({ + username: req.body.username, + password: passwordHash.generate(pwdHash), + role: req.body.role + }) + .then(record => { + res.json(record) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu createOne' + }) + }) +} // insertOne + +methods.getAll = (req, res, next) => { + User.find() + .then(records => { + res.json(records) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu getAll Book' + }) + }) +} //getAll + +methods.signup = (req, res, next) => { + let pwdHash = req.body.password + + // console.log(pwdHash); + User.create({ + username: req.body.username, + password: passwordHash.generate(pwdHash), + role: req.body.role + }) + .then(record => { + res.json(record) + }) + .catch(error => { + res.json({ + error + }) + }) +} // signup + +methods.signin = (username, password, next) => { + User.findOne({ + username: username + }) + .exec(function(err, record) { + // console.log(typeof record.password); + // let pwdHash = password + if (passwordHash.verify(password, record.password)) { + // secret itu kata khusus utk mengunci tokennya + + // recordtojson : mengassign data user menjadi object yg baru + + let data = Object.assign({}, record.toJSON()) + // console.log(data); + // utk delete passwordnya + // delete data.password + console.log(record); + let token = jwt.sign(data, 'secret', { + expiresIn: '1h' + }) + next(null, { + message: 'Login is Successful', + token + }) + } else { + next({ + message: 'Your password is not match' + }) + } + }) +} //signin + +module.exports = methods \ No newline at end of file diff --git a/helpers/check_token.js b/helpers/check_token.js new file mode 100644 index 0000000..49a73ac --- /dev/null +++ b/helpers/check_token.js @@ -0,0 +1,19 @@ +const jwt = require('jsonwebtoken') +let methods = {} + +methods.check_token_admin = (req, res, next) => { + let x = req.headers.token + jwt.verify(x, 'secret', (error, decoded) => { + if (decoded) { + if (decoded.role === 'admin') { + next() + } + } else { + res.send({ + error + }) + } + }) +} + +module.exports = methods \ No newline at end of file diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..922be19 --- /dev/null +++ b/models/user.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose') +let Schema = mongoose.Schema + +let userSchema = new Schema({ + username: { + type: String, + required: true + }, + password: { + type: String, + required: true + }, + role: { + type: String + } +}) // userSchema + +let User = mongoose.model('User', userSchema) + +module.exports = User \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..07284cf --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "auth-passport", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/uciarahito/auth-passport.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/uciarahito/auth-passport/issues" + }, + "homepage": "https://github.com/uciarahito/auth-passport#readme", + "dependencies": { + "body-parser": "^1.17.1", + "express": "^4.15.2", + "jsonwebtoken": "^7.4.0", + "mongoose": "^4.9.6", + "passport": "^0.3.2", + "passport-local": "^1.0.0", + "password-hash": "^1.2.2" + } +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..bf9f7e4 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,41 @@ +'use strict'; +const router = require('express').Router() +const userController = require('../controllers/userController') +const jwtHelpers = require('../helpers/check_token') +const passport = require('passport') +// const Strategy = require('passport-local').Strategy + +router.post('/api/users', jwtHelpers.check_token_admin, userController.insertOne) // admin only +router.get('/api/users', jwtHelpers.check_token_admin, userController.getAll) // admin only + +router.post('/api/signup', userController.signup) + +router.post('/api/signin', passport.authenticate('local', { + session: false +}), function(req, res) { + var user = req.user + res.send(user) + // res.send('test') +}) + +// passport.use(new Strategy( +// function(username, password, cb) { +// console.log(username); +// // request object is now first argument +// // ... +// //parameter pertama itu error, yg kedua data yg dibawanya +// if (username == 'butet' && password == "butet") { +// cb(null, { +// username: "butet" +// }) +// } else { +// cb('Username dan password not match') +// } +// } +// )); + +// router.post('/api/signin', userController.signin) + + + +module.exports = router \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..8e9de79 --- /dev/null +++ b/server.js @@ -0,0 +1,23 @@ +const express = require('express') +const passport = require('passport') +const Strategy = require('passport-local').Strategy +const bodyParser = require('body-parser') +const mongoose = require('mongoose') +var User = require('./models/user') +var controler = require('./controllers/userController') +const jwt = require('jsonwebtoken') + +const app = express() +app.use(require('body-parser').urlencoded({ + extended: false +})); + +mongoose.connect('mongodb://localhost/authpassport'); + +passport.use(new Strategy(controler.signin)); + +app.use(passport.initialize()); + +app.use('/', require('./routes')) + +app.listen(3000) \ No newline at end of file From 977d2c34ba664b0ffaed1ec8cc9cdc160acbf171 Mon Sep 17 00:00:00 2001 From: arahito Date: Wed, 26 Apr 2017 17:48:39 +0700 Subject: [PATCH 2/3] update README.md --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 63c92bc..3c1e893 100644 --- a/README.md +++ b/README.md @@ -1 +1,28 @@ -# auth-passport \ No newline at end of file +# auth-passport + +# auth-passport App + +## Demo app mongoose with REST API + +# REST API + +##List of basic routes: + + +| Routes | HTTP | Description | +| --------------- | ------------- | --------------------------- | +| /api/signup | POST | Sign up with new user info | +| /api/signin | POST | Sign in while get an access token based on credentials | + + +# Usage: + +## with only npm: + +npm install + +npm start + +npm run dev + +Access the website via http://localhost:3000 or API via http://localhost:3000/api \ No newline at end of file From 6b2a84a2dce28436a285a983db6273efeb9ff0ee Mon Sep 17 00:00:00 2001 From: Uci Arahito Lubis Date: Sun, 23 Jul 2017 19:04:30 +0700 Subject: [PATCH 3/3] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3c1e893..23677a6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # REST API -##List of basic routes: +## List of basic routes: | Routes | HTTP | Description | @@ -25,4 +25,4 @@ npm start npm run dev -Access the website via http://localhost:3000 or API via http://localhost:3000/api \ No newline at end of file +Access the website via http://localhost:3000 or API via http://localhost:3000/api