Невозможно сохранить JWT в Cook ie с Express и Angular - PullRequest
0 голосов
/ 02 августа 2020

Последние пару дней я выдергивала волосы. Независимо от того, сколько поисковых запросов в Google я выполняю, я не могу найти ответ, поэтому прихожу сюда в крайнем случае в надежде на некоторую помощь.

Я создаю приложение с полным стеком в стеке MEAN. Мой логин работает. Он проверяет, совпадают ли адрес электронной почты и пароль с адресом электронной почты и паролем пользователя в моей базе данных. Теперь я хочу отправить токен JWT своему клиенту, чтобы я мог оставить пользователя в гостинице. Я понимаю, как работает JWT, и я уже создал его

 const ACCESS_TOKEN_SECRET = "a random string";
 const payload = {"username": login_result[0].username}; 
 const accessToken = jwt.sign(payload, ACCESS_TOKEN_SECRET);

Здесь начинаются мои проблемы. Я хочу сохранить токен в cook ie, чтобы предотвратить атаки XSS. Я перепробовал всевозможные способы сохранить JWT в cook ie. Большинство форумов писали, что я должен сделать

res.cookie('access_token', accessToken);

Насколько я понимаю, это должно автоматически сохранить JWT в cook ie на моем клиенте под именем «access_token». Однако это не работает. Когда эта строка находится в коде, ничего не происходит. Под «ничего не происходит» я имею в виду, что код клиента не выполняется.

Если пароль / адрес электронной почты недействителен, я возвращаю код ошибки.

if(res.msg == "403"){
        this.showLogErrorMsg = true;
      }

Эта часть работает.

Оператор else выглядит следующим образом else {console.log («Действительное имя пользователя и пароль»);

    window.location.href = "http://localhost:4200/profile";

  }

Это означает, что если вход в систему неправильный, он напечатает ошибку (и это так), если вход в систему правильный, предполагается, что они будут перенаправлены. Это не работает. Он работал, когда я делал

ret.json({"access_token":accessToken}); 

, но не работал с

   res.cookie('access_token', accessToken); 

Это то, чего я не понимаю. Он не хранит access_token в файлах cookie и не выполняет код внутри оператора else. На моем сервере или клиенте нет сообщений об ошибках. Более того, в каждом руководстве или учебнике говорится об использовании res.cook ie, поскольку я использую Express в качестве своего веб-сервера. Я даже попытался добавить следующие параметры:

    res.cookie('access_token', accessToken,{domain: domain, path: '/',httpOnly:false, 
               secure:false,sameSite:false});

Решение состоит в том, чтобы каким-то образом заставить работать res.cookies, что я действительно хочу сделать, потому что это «то, что используют все остальные» и это кажется действительно холодным. Или отправьте токен JWT как res. json, а затем сохраните токен в cook ie в angular. Однако открывает ли это вам возможность использовать XSS? А если нет, то как мне сохранить что-нибудь повару ie в angular?

Заранее спасибо, ребята.

1 Ответ

0 голосов
/ 10 августа 2020

Это основное приложение c express, которое устанавливает, отменяет настройку и отображает файлы cookie.

  • установить GET /login
  • отключено GET /logout
  • дисплей GET /

Это не зависит от клиента (angular)

# main.js
const express = require('express')
const cookieParser = require('cookie-parser')

const app = express()
app.use(cookieParser())

const port = 3000
const accessToken = 'XXXXXXXXXXXXXXXXXXXXX';

app.get('/', (req, res) => {
    res.json(req.cookies)
});

app.get('/login', (req, res) => {
    res.cookie('access_token', accessToken, { path: '/', httpOnly: true, sameSite: "strict" })
    res.send('"access_token" cookies was set !')
});

app.get('/logout', (req, res) => {
    res.cookie('access_token', accessToken, { maxAge: 0 })
    res.send('"access_token" cookies was unset !')
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
});

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