# MEAN Stack Auth ## Create toggle to show app vs login/signup `index.html`: ```html

Sign Up

Username:
Password:

Log In

Username:
Password:
``` `app.js` inside controller: ```javascript this.loggedInUser = false; ``` ## Make fake signup/login forms call angular methods `app.js`: ```javascript this.signup = function(){ this.loggedInUser = { username: 'Matthew' } } this.login = function(){ this.loggedInUser = { username: 'matt' } } ``` `index.html`: ```html
Username:
Password:

Log In

Username:
Password:

Welcome {{ctrl.loggedInUser.username}}

``` ## Create user create route for api: create `controllers/users.js`: ```javascript const express = require('express'); const router = express.Router(); router.post('/', (req, res) => { res.json(req.body); }); module.exports = router; ``` `server.js`: ```javascript const usersController = require('./controllers/users.js'); app.use('/users', usersController); ``` ## Create User model create `models/users.js`: ```javascript const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ username: String, password: String }); const User = mongoose.model('User', userSchema); module.exports = User; ``` `controllers/users.js`: ```javascript const User = require('../models/users.js'); router.post('/', (req, res) => { User.create(req.body, (error, createdUser) => { res.json(createdUser); }) }); ``` ## Add bcrypt to sign up ``` npm install bcrypt ``` `controllers/users.js`: ```javascript const bcrypt = require('bcrypt'); //... router.post('/', (req, res) => { req.body.password = bcrypt.hashSync(req.body.password, bcrypt.genSaltSync(10)); User.create(req.body, (error, createdUser) => { res.json(createdUser); }) }); ``` ## Make request to create user api route in angular `index.html`: ```html Username:
Password:
``` `app.js`: ```javascript this.signup = function(){ $http({ url:'/users', method:'POST', data: { username: this.signupUsername, password: this.signupPassword } }).then(function(response){ controller.loggedInUser = response.data; }) } ``` ## Create session create route create `controllers/session.js`: ```javascript const express = require('express'); const router = express.Router(); const User = require('../models/users.js'); router.post('/', (req, res) => { User.findOne({username:req.body.username}, (error, foundUser) => { res.json(foundUser) }); }); module.exports = router; ``` `server.js`: ```javascript const sessionController = require('./controllers/session.js'); app.use('/session', sessionController); ``` ## Check password `controllers/session.js`: ```javascript const bcrypt = require('bcrypt'); //... router.post('/', (req, res) => { User.findOne({username:req.body.username}, (error, foundUser) => { if(foundUser === null){ res.json({ message:'user not found', }); } else { const doesPasswordMatch = bcrypt.compareSync(req.body.password, foundUser.password); if(doesPasswordMatch){ res.json(foundUser) } else { res.json({ message:'user not found' }); } } }); }); ``` ## Integrate with Angular ```html

Log In

Username:
Password:
``` ```javascript this.login = function(){ $http({ url:'/session', method:'POST', data: { username: this.loginUsername, password: this.loginPassword } }).then(function(response){ if(response.data.username){ controller.loggedInUser = response.data; } else { controller.loginUsername = null; controller.loginPassword = null; } }) } ``` ## Set up sessions ``` npm install express-session ``` `app.js`: ```javascript const session = require('express-session'); //... app.use(session({ secret:'feedmeseymour', resave:false, saveUninitialized:false })) ``` ## Set session on login `controllers/session.js`: ```javascript const doesPasswordMatch = bcrypt.compareSync(req.body.password, foundUser.password); if(doesPasswordMatch){ req.session.user = foundUser; //add this line res.json(foundUser) } else { res.json({ message:'user not found' }); } ``` ## Set session on sign up `controllers/users.js`: ```javascript User.create(req.body, (error, createdUser) => { req.session.user = createdUser; //add this line res.json(createdUser); }) ``` ## Test to see if user is logged in on page load `app.js`: ```javascript // bottom of controller this.getTodos(); $http({ method:'GET', url:'/session' }).then(function(response){ console.log(response); }); ``` `controllers/session.js`: ```javascript router.get('/', (req, res) => { res.json(req.session.user); }) ``` ## Set session data in angular `app.js`: ```javascript $http({ method:'GET', url:'/session' }).then(function(response){ if(response.data.username){ controller.loggedInUser = response.data; } }); ``` ## Log out functionality `controllers/session.js`: ```javascript router.delete('/', (req, res) => { req.session.destroy(() => { res.json({ destroyed:true }); }) }); ``` `index.html` (after welcome `h2`): ```html ``` `app.js`: ```javascript this.logout = function(){ $http({ url:'/session', method:'DELETE' }).then(function(){ controller.loggedInUser = false; }) } ```