0

我无法在我的 Sapper 应用程序中设置 req.user,我做错了什么

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

4

2 回答 2

2

我有同样的问题。

我安装了模块“express-session”。(这个模块也适用于 polka.js)

并设置工兵的中间件:

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

我在服务器端和登录页面上写了一个“api/login/”。一旦服务器通过他的登录名识别用户并通过',我使用 goto(".")。

goto() 的行为应该类似于 location.href。但这不是。所以我用 location.href(".") 替换 goto(".")。有了这个,我有来自服务器的会话数据。(在预加载和存储中 => $session.user)。

我希望这可以帮助你。

于 2020-04-06T09:55:30.453 回答
0

我找到了部分解决方案,如果我错了,请更正。因此,整个应用程序都由 sapper.middleware 控制,并且它本身的服务器对其没有自动影响。所以没有设置 req.user ,没有设置 session 和 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 });

因此,我的进一步操作是检查服务器上的会话存储中是否存在 sessionid,如果是,则继续,如果没有将用户设置为 null 并重定向到登录。

这是对的吗 ?够安全吗?

编辑

所以我的部分“解决方案”不适用于任何与护照身份验证解决方案有相同问题的人

  1. 你必须在 server.js 之前的 sapper.middleware 中定义路由
  2. app.httpRequest('/route',YOURAUTHENTICATION MIDDLEWARE)
  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 之后,您可以从会话中预加载用户。希望这很清楚!

于 2019-12-30T20:08:31.890 回答