У меня есть экспресс-сервер node.js, созданный с помощью Postman и протестированный с Jest Я написал фронтэнд с hbs и следующий шаг - их прошить. Тем не менее, я все еще получаю сообщение об ошибке «Пожалуйста, авторизуйтесь» от моей функции аутентификации, которое, как мне кажется, связано с тем, что я не могу успешно передать свой токен jwt.
Итак, на странице входа в систему (пользователи / логин) я хочу войти в систему с помощью электронной почты и пароля, а затем перенаправить на мою страницу (пользователи / я), где я могу выполнять другие действия, принадлежащие этому пользователю.
Фронтальный
код страницы входа:
<section class="login-bg">
<div class="login-form">
<p>Welcome to Task Manager, please log in!</p>
<form class="input-group" action="/users/login" method="POST">
<label>Email:</label>
<input type="email" name="email" placeholder="type your email" value="{{user.email}}" required >
<label>Password:</label>
<input type="password" name="password" placeholder="type your password" value="{{user.password}}" required>
<button class="button" type="submit">Log In</button>
</form>
</div>
</section>
Back-конец
в промежуточном программном обеспечении / auth.js
const jwt = require('jsonwebtoken')
const User = require('../models/user')
const auth = async (req, res, next) => {
try {
const token = req.header('Authorization').replace('Bearer ', '')
const decoded = jwt.verify(token, process.env.JWT_SECRET)
const user = await User.findOne({_id: decoded._id, 'tokens.token': token})
if (!user) {
throw new Error()
}
req.token = token
req.user = user
next()
} catch (error) {
res.status(401).send({error: 'Please authenticate.'})
}
}
module.exports = auth
в src / routers / users.js
router.post('/login', async (req, res) => {
try {
const user = await User.findByCredentials(req.body.email, req.body.password)
const token = await user.generateAuthToken()
res.cookie('jwt',token, { httpOnly: true, secure: true, maxAge: 3600000 })
res.redirect('/users/me')
} catch (error) {
res.status(400).send()
}
})
Однако, когда я делаю console.log (document.cookie) в users / me, он говорит, что не определен.
Затем я установил cookie-парсер и импортировал его в app.js, и попытался записать эту часть в src / routers / users.js:
router.get('/me', auth, async (req, res) => {
console.log('Cookies: ', req.cookies)
try {
res.render('me', {name: user.name})
} catch (error) {
res.status(500).send()
}
})
но эта консоль ничего не печатает, возможно, потому что я получаю ошибку от аутентификации.
У меня также есть файл js, прикрепленный ко мне, но я понятия не имею, могу ли я написать таким образом, возможно, неправильно:
const userToken = document.cookie.jwt.token
fetch('/users/me', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + userToken
}
})
.then(res => res.json())
.then(data => { console.log(data) })
.catch(err => { console.log(err) })
тогда в Сети / Заголовки у меня
URL запроса:
http://localhost:3000/users/login
Способ запроса:
POST
Код статуса:
302 Найдено
Удаленный адрес:
Политика реферера:
нет-реферер-когда-понижение рейтинга
Заголовки ответа
Подключение:
держать-жив
Content-Length:
62
Content-Type:
Текст / html; кодировка = UTF-8
Дата:
Пт, 07 июня 2019 18:41:47 GMT
Расположение:
/ пользователей / я
Set-Cookie:
JWT = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1Y2Y2NjNlMTQwMTQyYjE0MzhmZTJjNDMiLCJpYXQiOjE1NTk5MzI5MDd9.T_P8O-j98cs9gtahTzspJjx1qNMSe3M5OAySyeH25fs; Max-Age = 3600; Path = /; Истекает = Пт, 07 июня 2019 19:41:47 GMT; HttpOnly; Secure
Вары:
Accept
X-Powered-By:
Express
Нет файлов cookie запроса, только файлы cookie ответа. Я не уверен, что это значит ... @ _ @
Я хочу передать jwt для успешного входа и правильно отобразить страницу me, как я могу это сделать?