Last active
May 5, 2022 20:28
-
-
Save emaitee/5e1521b4637ceebf8a67339866432632 to your computer and use it in GitHub Desktop.
passport-jwt-sequelize-mysql
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const express = require('express'); | |
| const bodyParser = require('body-parser'); | |
| const jwt = require('jsonwebtoken'); | |
| const passport = require('passport'); | |
| const passportJWT = require('passport-jwt'); | |
| let ExtractJwt = passportJWT.ExtractJwt; | |
| let JwtStrategy = passportJWT.Strategy; | |
| let jwtOptions = {}; | |
| jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); | |
| jwtOptions.secretOrKey = 'wowwow'; | |
| // lets create our strategy for web token | |
| let strategy = new JwtStrategy(jwtOptions, function(jwt_payload, next) { | |
| console.log('payload received', jwt_payload); | |
| let user = getUser({ id: jwt_payload.id }); | |
| if (user) { | |
| next(null, user); | |
| } else { | |
| next(null, false); | |
| } | |
| }); | |
| // use the strategy | |
| passport.use(strategy); | |
| const app = express(); | |
| // initialize passport with express | |
| app.use(passport.initialize()); | |
| // parse application/json | |
| app.use(bodyParser.json()); | |
| //parse application/x-www-form-urlencoded | |
| app.use(bodyParser.urlencoded({ extended: true })); | |
| const Sequelize = require('sequelize'); | |
| // initialze an instance of Sequelize | |
| const sequelize = new Sequelize({ | |
| database: 'test_sequelize', | |
| username: 'root', | |
| password: '', | |
| dialect: 'mysql', | |
| }); | |
| // check the databse connection | |
| sequelize | |
| .authenticate() | |
| .then(() => console.log('Connection has been established successfully.')) | |
| .catch(err => console.error('Unable to connect to the database:', err)); | |
| // create user model | |
| const User = sequelize.define('user', { | |
| name: { | |
| type: Sequelize.STRING, | |
| }, | |
| password: { | |
| type: Sequelize.STRING, | |
| }, | |
| }); | |
| // create table with user model | |
| User.sync() | |
| .then(() => console.log('User table created successfully')) | |
| .catch(err => console.log('oooh, did you enter wrong database credentials?')); | |
| // create some helper functions to work on the database | |
| const createUser = async ({ name, password }) => { | |
| return await User.create({ name, password }); | |
| }; | |
| const getAllUsers = async () => { | |
| return await User.findAll(); | |
| }; | |
| const getUser = async obj => { | |
| return await User.findOne({ | |
| where: obj, | |
| }); | |
| }; | |
| // set some basic routes | |
| app.get('/', function(req, res) { | |
| res.json({ message: 'Express is up!' }); | |
| }); | |
| // get all users | |
| app.get('/users', function(req, res) { | |
| getAllUsers().then(user => res.json(user)); | |
| }); | |
| // register route | |
| app.post('/register', function(req, res, next) { | |
| const { name, password } = req.body; | |
| createUser({ name, password }).then(user => | |
| res.json({ user, msg: 'account created successfully' }) | |
| ); | |
| }); | |
| //login route | |
| app.post('/login', async function(req, res, next) { | |
| const { name, password } = req.body; | |
| if (name && password) { | |
| let user = await getUser({ name: name }); | |
| if (!user) { | |
| res.status(401).json({ message: 'No such user found' }); | |
| } | |
| if (user.password === password) { | |
| // from now on we'll identify the user by the id and the id is the | |
| // only personalized value that goes into our token | |
| let payload = { id: user.id }; | |
| let token = jwt.sign(payload, jwtOptions.secretOrKey); | |
| res.json({ msg: 'ok', token: token }); | |
| } else { | |
| res.status(401).json({ msg: 'Password is incorrect' }); | |
| } | |
| } | |
| }); | |
| // protected route | |
| app.get('/protected', passport.authenticate('jwt', { session: false }), function(req, res) { | |
| res.json('Success! You can now see this without a token.'); | |
| }); | |
| // start app | |
| app.listen(3000, function() { | |
| console.log('Express is running on port 3000'); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment