Я создаю интерфейс аутентификации регистрации / входа с помощью Vue.js, Node, Express и MongoDB.До сих пор я успешно настраивал свой компонент Register.vue
, чтобы разрешить ввод электронной почты и пароля в базу данных MongoDB, при этом пароль шифровался с помощью пакета bcrypt
.Сейчас я пытаюсь настроить маршрут users.post('/login', (req, res) => {}
в users.js
, чтобы сравнить пароль и адрес электронной почты, хранящиеся в mongoDB, с паролем и адресом электронной почты, введенными на странице входа.Затем я хочу присвоить полезную нагрузку token
, а затем передать этот токен localStorage
(см. store.js
).
Чтобы попытаться это сделать, я добавил маршрут users.get('/allUsers', (req, res) => {}
для обработки запроса и ответа сохраненных данных, но не уверен, как настроить users.post('/login', (req, res) => {}
, чтобы хранимые данные сравнивались с введеннымиданные в Login.vue
для входа в систему.
Любые рекомендации о том, как этого добиться?Спасибо!Мой код ниже:
Login.vue
<template lang="html">
<v-container>
<v-form
@submit.prevent="login()"
>
<v-text-field
v-model="email"
label="E-mail"
required
></v-text-field>
<v-text-field
v-model="password"
type="password"
label="Password"
required
></v-text-field>
<v-btn type="submit" color="primary">Login</v-btn>
</v-form>
</v-container>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
email: "",
password: ""
}
},
methods: {
async login() {
await axios.post('http://localhost:5000/users/login', {
email: this.email,
password: this.password
})
await this.$store.dispatch("login")
this.$router.push('/')
}
}
}
</script>
<style lang="css" scoped>
</style>
users.js
const express = require("express")
const users = express.Router()
const cors = require("cors")
const jwt = require("jsonwebtoken")
const bcrypt = require("bcrypt")
const User = require("../models/User")
users.use(cors())
process.env.SECRET_KEY = 'secret'
users.get("/allUsers", (req, res) => {
User.find({}, 'email password', function (error, newData) {
if (error) { console.error(error); }
res.send({
newData: newData
})
})
})
users.post("/register", (req, res) => {
const today = new Date()
const userData = {
email: req.body.email,
password: req.body.password,
created: today
}
User.findOne({
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({
email: req.body.email,
})
.then(user => {
if (user) {
if (bcrypt.compareSync(req.body.password, user.password)) {
const payload = {
_id: user._id,
email: user.email
}
let token = jwt.sign(payload, process.env.SECRET_KEY, {
expiresIn: 1440
})
res.send(token)
} else {
res.json({ error: 'User does not exist' })
}
} else {
res.json({ error: 'User does not exist' })
}
})
.catch(err => {
res.send('error: ' + err)
})
})
module.exports = users
store.js
import axios from 'axios'
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const LOGIN = "LOGIN";
const LOGIN_SUCCESS = "LOGIN_SUCCESS";
const LOGOUT = "LOGOUT";
export default new Vuex.Store({
state: {
isLoggedIn: localStorage.getItem("token")
},
mutations: {
[LOGIN](state) {
state.pending = true;
},
[LOGIN_SUCCESS](state) {
state.isLoggedIn = true;
state.pending = false;
},
[LOGOUT](state) {
state.isLoggedIn = false;
}
},
actions: {
async login({
commit
}) {
let result = await axios.get('http://localhost:5000/users/allUsers')
localStorage.setItem('token', result.data.newData)
commit(LOGIN); // show spinner
return new Promise(resolve => {
setTimeout(() => {
commit(LOGIN_SUCCESS);
resolve();
}, 1000);
});
},
logout({
commit
}) {
localStorage.removeItem("token");
commit(LOGOUT);
}
}
})