Почему пользователь запроса не определен в приложении Sapper

Я не могу установить req.user в моем приложении Sapper, что я делаю не так

express()
    .use(
        bodyParser.urlencoded({
            extended: true
        }),
        bodyParser.json(),
        compression({
            threshold: 0
        }),
        sirv('static', {
            dev
        }),
        cookieParser(),
        session({
            store: store,
            secret: 'somesecret',
            resave: false,
            saveUninitialized: true,
            cookie: {
                secure: true,
                maxAge: 604800000,
            }
        }),
        passport.initialize(),
        passport.session(),
        sapper.middleware({
            session: (req, res) => {
                let user = req.session.user
                return {
                    user
                }
            }
        }),


    )

У меня есть компонент входа в систему, из которого я использую выборку

в папке входа у меня есть login.js файл, маршрут на стороне сервера, и я не могу получить свой req.user не req.session.user, не req.session.passport


person Artur O    schedule 30.12.2019    source источник


Ответы (2)


У меня такая же проблема.

Установил модуль "экспресс-сессия". (Этот модуль также работает с polka.js)

И ставим промежуточное ПО сапера:

sapper.middleware({
   session: (req, res) => ({
      user: req.session.user
   })

Я написал «api / login /» на стороне сервера и на странице входа. После того, как сервер распознает пользователя с его логином и передачей ', я использую goto (".").

Поведение goto () должно быть похоже на location.href. Но это не так. Поэтому я заменяю goto (".") На location.href ("."). Благодаря этому у меня есть данные сеанса с сервера. (В предварительной загрузке и в store => $ session.user) .

Надеюсь, это поможет вам.

person Axel RÉCOLET    schedule 06.04.2020

Я нашел частичное решение, исправьте его, если я ошибаюсь. Таким образом, все приложение контролируется sapper.middleware, а сам сервер не оказывает на него автоматического воздействия. Таким образом, req.user не установлен, сеанс и значение cookie не установлены, все должно быть вручную установлено из маршрута аутентификации.

Итак, мое решение заключалось в том, чтобы установить cookie в маршруте публикации входа в систему, поэтому в файле login.js.

import passport from 'passport'

export async function post(req, res, next) {
    passport.authenticate('local', (err, user, info) => {
        if (err) {
            return res.json(err)
        }
        if (user) {
            // console.log(req)
            return res.status(201).cookie('user', req.sessionID).json({
                email: user.email,
                id: user._id
            })
        }
        if (info) {
            return res.json(info)
        }
    })(req, res, next);


}

в компоненте login.svelte я установил свой сеанс (SAPPER MIDDLEWARE SESSION)

session.set({ user: true, email: user_data.email, id: user_data.id });

Итак, мое Дальнейшее действие - проверить, существует ли идентификатор сеанса в хранилище сеансов на сервере, если да, продолжить, если пользователь не установлен на null и перенаправить на вход.

это правильно? Достаточно ли это безопасно?

Изменить

Итак, мое частичное «решение» не подходит для тех, у кого такая же проблема с решением для аутентификации паспорта.

  1. вы должны определить маршрут в server.js до sapper.middleware
  2. app.httpRequest ('/ route', ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ВАШЕГО АВТОРИЗАЦИИ)
  3. в вашем файле route.js или в файле index.js папки маршрута у вас будет ваш req.user
  4. в промежуточном программном обеспечении sapper ваш объект сеанса должен выглядеть так
     session: (req, res) => ({
                        user: req.session.passport ? req.session.passport.user : null })

если вы попытаетесь передать req.user, он не будет сериализован пакетом sapper / devalue, и вы будете продолжать получать ошибку.

После этого в вашем route.js вы можете предварительно загрузить пользователя из сеанса. надеюсь, это было ясно!

person Artur O    schedule 30.12.2019