Как сохранить jwt в cookie и передать его функции аутентификации при перенаправлении страницы? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть экспресс-сервер 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, как я могу это сделать?

1 Ответ

0 голосов
/ 10 июня 2019

Ваш cookie-файл токена jwt не работает, поскольку он объявляет флаг secure: true в следующем коде:

res.cookie('jwt',token, { httpOnly: true, secure: true, maxAge: 3600000 })

, что приводит к отметке Secure в ответе HTTP, указывая, что этот файл cookie доступен только по протоколу HTTPS.окружение:

Set-Cookie:
jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1Y2Y2NjNlMTQwMTQyYjE0MzhmZTJjNDMiLCJpYXQiOjE1NTk5MzI5MDd9.T_P8O-j98cs9gtahTzspJjx1qNMSe3M5OAySyeH25fs; 
Max-Age=3600; Path=/; 
Expires=Fri, 07 Jun 2019 19:41:47 GMT; HttpOnly; Secure

Поскольку URL-адрес вашего запроса использует HTTP (http://localhost:3000/users/login), cookie будет игнорироваться браузером.

...