Аутентификация с использованием Jwt и nodejs - PullRequest
0 голосов
/ 27 марта 2019

У меня две проблемы.

1.При попытке выполнить аутентификацию с использованием токена JWT и Nodejs я могу войти в систему и выйти из нее, но при входе в систему, если я обновляю страницу, панель навигации исчезает.

  1. когда я не вошел в систему на странице входа в систему, я дал ссылку на страницу регистрации, когда нажал, что она не перенаправляет на эту страницу. Это происходит, когда я не даю навигационную панель для аутентификации.

Это страница входа

<template>
    <div class="container">
        <div class="row">
            <div class="col-md-6 mt-5 mx-auto">
                <form v-on:submit.prevent="login">
                    <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
                    <div class="form-group">
                        <label for="email">Email Address</label>
                        <input type="email" v-model="email" class="form-control" name="email" placeholder="Enter Email" required>
                    </div>
                    <div class="form-group">
                        <label for="password">Password</label>
                        <input type="password" v-model="password" class="form-control" name="email" placeholder="Enter Password" required>
                    </div>
                    <button class="btn btn-lg btn-danger btn-block" type="submit">Login</button>
                    <a href="/register">New User? Register here</a>
                </form>
            </div>
        </div>
    </div>
</template>

<script>
import axios from 'axios'
import router from '../router'
import EventBus from './EventBus'
import Navbar from '@/components/Navbar'
export default {
  components: {Navbar},
  data () {
    return {
      email: '',
      password: ''
    }
  },

  methods: {
    login () {
      axios.post('http://localhost:5000/users/login',
        {
          email: this.email,
          password: this.password
        }).then((res) => {
        localStorage.setItem('usertoken', res.data)
        this.email = ''
        this.password = ''
        if (res) {
        this.emitMethod()
        router.push({ name: 'profile' })
        } 
      }).catch(err => {
        console.log(err, alert('User doesnot exist'))

      })
    },
    emitMethod () {
      EventBus.$emit('logged-in', 'loggedin')
    }
  }
}
</script>

Это скрипт, который я использую для выхода из системы

logout () {
      localStorage.removeItem('usertoken')
    }

Пользовательские маршруты

const express = require("express")
const users = express.Router()
const cors = require("cors")
const jwt = require("jsonwebtoken")
const bcrypt = require("bcryptjs")

const User = require("../model/User")
users.use(cors())

process.env.SECRET_KEY = 'secret'

users.post("/register", (req, res) => {
    const today = new Date()
    const userData = {
        firstName: req.body.firstName,
        lastName: req.body.lastName,
        email: req.body.email,
        password: req.body.password,
        city: req.body.city,
        cycle: req.body.cycle,
        created: today
    }

    User.findOne({
        where: {
            email: req.body.email
        }
    })
        .then(user => {
            if (!user) {
                bcrypt.hash(req.body.password, 10, (err, hash) => {
                    userData.password = hash
                    User.create(userData)
                        .then(user => {
                            res.json({ status: user.email + ' registered' })
                        })
                        .catch(err => {
                            res.send('error: ' + err)
                        })
                })
            } else {
                res.json({ "error": 'User already exists' })

            }
        })
        .catch(err => {
            res.send('error: ' + err)
        })
})

users.post("/login", (req, res) => {
    User.findOne({
        where: {
            email: req.body.email
        }
    })
        .then(user => {
            if (user) {
                if (bcrypt.compareSync(req.body.password, user.password)) {
                    let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
                        expiresIn: 1440
                    })
                    res.send(token)
                }
            } else {
                res.status(400).json({ error: 'User does not exist' })
            }
        })
        .catch(err => {
            res.status(400).json({ error: err })

        })
})

users.get('/profile', (req, res) => {
    var decoded = jwt.verify(req.headers['authorization'], process.env.SECRET_KEY)

    User.findOne({
        where: {
            userId: decoded.userId
        }
    })
    .then(user => {
        if (user) {
            res.json(user)
        } else {
            res.send('User does not exist')
        }
    })
    .catch(err => {
        res.send('error: ' + err)
    })
})

users.put("/:userId", (req, res) => {
        if (!req.body.firstName,
            !req.body.lastName,
            !req.body.city,
            !req.body.cycle,
            !req.body.biography) {
            res.status(400)
            res.json({
                error: "Bad Data"
            })
        } else {
            User.update(
                { firstName: req.body.firstName,
                  lastName: req.body.lastName,
                  city: req.body.city,
                  cycle: req.body.cycle,
                  biography: req.body.biography
                },
                { where: { userId: req.params.userId } }
            )
            .then(() => {
               res.send("Contact updated")
            })
            .error(err => res.send(err))
        }
    })

module.exports = users

1 Ответ

0 голосов
/ 27 марта 2019

Я не уверен, что создаваемое вами веб-приложение просто для развлечения или вы планируете использовать его в производстве, если да, то я предлагаю вам не использовать localStorage для сохранения токена.JWT должен храниться в безопасном месте внутри браузера пользователя.

Если вы храните его внутри localStorage, он доступен любому скрипту на вашей странице (что так плохо, как кажется, что атака XSS может позволитьвнешний злоумышленник получает доступ к токену).

Не храните его в локальном хранилище (или хранилище сеанса).Если какой-либо из сценариев 3-й части, включенных в вашу страницу, скомпрометирован, он может получить доступ ко всем токенам ваших пользователей.

JWT должен храниться в файле cookie HttpOnly, специальном виде файла cookie, который отправляется только вHTTP-запросы к серверу, и он никогда не доступен (как для чтения, так и для записи) из JavaScript, работающего в браузере.

Источник:

  1. https://auth0.com/docs/security/store-tokens
  2. https://logrocket.com/blog/jwt-authentication-best-practices/
  3. https://blog.usejournal.com/sessionless-authentication-withe-jwts-with-node-express-passport-js-69b059e4b22c

Теперь возвращаясь к первоначальному вопросу, я вижу

import Navbar from '@/components/Navbar'

Но я не использую его вшаблон, также вы можете опубликовать компонент Vue, с которым у вас возникли проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...