├── README.md ├── .gitignore ├── models └── user.js ├── package.json ├── index.js └── routes └── routes.js /README.md: -------------------------------------------------------------------------------- 1 | # node-auth 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | 3 | const userSchema = new mongoose.Schema({ 4 | name: { 5 | type: String, 6 | required: true 7 | }, 8 | email: { 9 | type: String, 10 | unique: true, 11 | required: true 12 | }, 13 | password: { 14 | type: String, 15 | required: true 16 | } 17 | }) 18 | 19 | module.exports = mongoose.model('User', userSchema) 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "auth", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon index.js" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcryptjs": "^2.4.3", 13 | "cookie-parser": "^1.4.5", 14 | "cors": "^2.8.5", 15 | "express": "^4.17.1", 16 | "jsonwebtoken": "^8.5.1", 17 | "mongoose": "^5.11.15" 18 | }, 19 | "devDependencies": { 20 | "nodemon": "^2.0.7" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const mongoose = require('mongoose') 3 | const cors = require('cors') 4 | const cookieParser = require('cookie-parser') 5 | 6 | mongoose.connect('mongodb://localhost/node_auth', { 7 | useNewUrlParser: true, 8 | useUnifiedTopology: true 9 | }, () => { 10 | console.log('connected to the database') 11 | }) 12 | 13 | const routes = require('./routes/routes') 14 | 15 | app = express() 16 | 17 | app.use(cookieParser()) 18 | app.use(cors({ 19 | credentials: true, 20 | origin: ['http://localhost:3000', 'http://localhost:8080', 'http://localhost:4200'] 21 | })) 22 | 23 | app.use(express.json()) 24 | 25 | app.use('/api', routes) 26 | 27 | app.listen(8000) 28 | -------------------------------------------------------------------------------- /routes/routes.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router() 2 | const bcrypt = require('bcryptjs') 3 | const jwt = require('jsonwebtoken') 4 | const User = require('../models/user') 5 | 6 | router.post('/register', async (req, res) => { 7 | const salt = await bcrypt.genSalt(10) 8 | const hashedPassword = await bcrypt.hash(req.body.password, salt) 9 | 10 | const user = new User({ 11 | name: req.body.name, 12 | email: req.body.email, 13 | password: hashedPassword, 14 | }) 15 | 16 | const result = await user.save() 17 | 18 | const {password, ...data} = await result.toJSON() 19 | 20 | res.send(data) 21 | }) 22 | 23 | router.post('/login', async (req, res) => { 24 | const user = await User.findOne({email: req.body.email}) 25 | 26 | if (!user) { 27 | return res.status(404).send({ 28 | message: 'user not found' 29 | }) 30 | } 31 | 32 | if (!await bcrypt.compare(req.body.password, user.password)) { 33 | return res.status(400).send({ 34 | message: 'invalid credentials' 35 | }) 36 | } 37 | 38 | const token = jwt.sign({_id: user._id}, "secret") 39 | 40 | res.cookie('jwt', token, { 41 | httpOnly: true, 42 | maxAge: 24 * 60 * 60 * 1000 // 1 day 43 | }) 44 | 45 | res.send({ 46 | message: 'success' 47 | }) 48 | }) 49 | 50 | router.get('/user', async (req, res) => { 51 | try { 52 | const cookie = req.cookies['jwt'] 53 | 54 | const claims = jwt.verify(cookie, 'secret') 55 | 56 | if (!claims) { 57 | return res.status(401).send({ 58 | message: 'unauthenticated' 59 | }) 60 | } 61 | 62 | const user = await User.findOne({_id: claims._id}) 63 | 64 | const {password, ...data} = await user.toJSON() 65 | 66 | res.send(data) 67 | } catch (e) { 68 | return res.status(401).send({ 69 | message: 'unauthenticated' 70 | }) 71 | } 72 | }) 73 | 74 | router.post('/logout', (req, res) => { 75 | res.cookie('jwt', '', {maxAge: 0}) 76 | 77 | res.send({ 78 | message: 'success' 79 | }) 80 | }) 81 | 82 | module.exports = router; 83 | --------------------------------------------------------------------------------