Лучшая практика для передачи JWT с сервера на клиент - PullRequest
0 голосов
/ 30 апреля 2020

Я создаю приложение с аутентификацией пользователя, и у меня возникают проблемы с обработкой JWT с помощью React и Express. Я устанавливаю cook ie в ответе сервера, и я могу видеть cook ie в браузере на моем клиенте. Однако, когда я делаю запрос к своему серверу после этого, req.cookies.token все еще не определен.

# server/routes.js

// return authenticated user
app.get('/auth', async (req, res) => {
    console.log(req.cookies.token)
})

// register user
app.post('/user', async (req, res) => {
    const { name, email, password } = req.body,
          hash = await bcrypt.hash(password, 10);

    let user = new User({ 
        name: name.toLowerCase(), 
        email: email.toLowerCase(), 
        password: hash,
        picture: null
    })

    try {
        let newUser = await user.save()

        let token = jwt.sign({
            id: newUser.id,
            name: newUser.name,
            picture: newUser.picture
        }, config.secret)

        res.status(200).cookie("token", token, { 
            domain: "localhost",
            httpOnly: true, 
            secure: false
        }).send('success')
    } catch (error) {
        console.log(error)
    }
})

В моем файле сервера я импортирую и использую библиотеку синтаксического анализатора cook ie, например:

# index.js

var express = require('express')
var app = express()

var cookies = require('cookie-parser')
var bodyParser = require('body-parser')
var cors = require('cors')

var mongoose = require('mongoose')
var config = require('./config')

app.use(cookies())
app.use(cors({
    origin: 'http://localhost:3000',
    credentials: true
}))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
    extended: true
}))

require('./routes')(app)

Кроме того, поскольку я устанавливаю httpOnly только для повара ie разве я не должен видеть повара ie на клиенте? Я подумываю просто установить токен в заголовке авторизации от клиента, как это

# hoc/authenticate.js

if(cookies.get('token')) {
  axios.defaults.headers.common['Authorization'] = `Bearer ${cookies.get('token')}`
}

Также не будет ли масштабирование аутентификации таким способом? Например, если у меня есть 1000 пользователей, подключающихся к моему сайту, будут ли проблемы с cookie-файлами?

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