· 6 years ago · Oct 27, 2019, 09:02 AM
1const passport = require('passport')
2const LocalStrategy = require('passport-local').Strategy
3const JwtStrategy = require('passport-jwt').Strategy
4const ExtractJwt = require('passport-jwt').ExtractJwt
5
6// Como iremos verificar se o usuário está ou não
7// cadastrado no banco de dados. Temos que importar
8// nossos models
9const User = require('../database/models/user')
10const ObjectId = require('mongoose').ObjectId
11
12// Importamos a secret key que definimos no arquivo '.env'
13// Servirá para gerar a assinatura do token
14const { secretKey } = require('../environment/vars')
15
16// Estratégia Local: Receberá o POST do Login.
17// No body desta requisição, teremos o campo 'email' e 'password'
18passport.use(new LocalStrategy({
19 usernameField: 'email',
20 passwordField: 'password'
21 },
22 async function (email, password, done) {
23
24 // O Middlware verifica se o usuário existe no banco de dados
25 await User.findOne({ email }, (err, user) => {
26 if (err) {
27 return done(err)
28 }
29
30 // Se não existir, retorna false ("Não autorizado!")
31 if (!user) {
32 return done(null, false, { message: "User doesn't exist" })
33 }
34
35 // Se existir, verifica se a senha informada está correta
36 user.compare(password, user.password)
37 .then(match => {
38
39 // Se não estiver, retorna false ("Não autorizado!")
40 if (!match) {
41 return done(null, false, { message: 'Incorrect Password' })
42 }
43
44 // Se sim, retorna as informações do usuário para que o Token seja gerado
45 return done(null, user)
46 })
47 })
48 }
49))
50
51// Você deve definir estas funções, caso use Sessões.
52passport.serializeUser((user, done) => {
53 done(null, user._id)
54})
55
56passport.deserializeUser(async (id, done) => {
57 await User.findById({ _id: ObjectId(id) }, (err, user) => {
58 done(err, user)
59 })
60})
61
62// Estratégia JWT: Após autenticado, o usuário deverá
63// enviar o token no Header da requisição.
64const opts = {
65 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
66 secretOrKey: secretKey
67}
68
69// Aqui, o middleware irá extrair o token do Header
70// e verificar se ele é válido. Se o token estiver expirado,
71// ou adulterado, o middleware retorna false ("Não autorizado")
72passport.use(new JwtStrategy(opts, async (payload, done) => {
73 await User.findOne({ _id: payload._id }, (err, user) => {
74 if (err) {
75 return done(err, false)
76 }
77
78 if (!user) {
79 return done(null, false)
80 }
81
82 return done(null, { id: user._id })
83 })
84}))
85
86
87// Retornamos o middleware
88module.exports = app => {
89 app.use(passport.initialize())
90}