【问题标题】:Redirect not working after creating a user创建用户后重定向不起作用
【发布时间】:2021-04-13 20:23:21
【问题描述】:

所以前几天我在一个网站上工作,在那里我创建了一个路由来处理用户的注册过程。这很好用,当我几天前测试它时。

然后我在我的网站上处理了一些其他的东西(登录和个人资料网站等),当我回来测试一些其他的东西时(我需要创建一个新的用户帐户,因为我添加了一些东西)注册不再工作了。

这是我的代码:

app.post('/signup', (req, res) => {
  if (!req.body.accept) {
    res.redirect('/signup?error=must_accept')
  }

  // E-Mail exists in database
  connection.query('SELECT LogMail FROM u WHERE LogMail = ?;', req.body.mail, function(err, rows, fields) {
    if (err) throw err;

    if (rows.length > 0) {
      console.log('this email exists already')
    } else {
      key_pair = generate_key_pair()
      datetime = getDateTime()

      user = {
        ID_u: generate_ID(),
        Created: datetime,
        LogMail: req.body.mail,
        Verified: '0000-00-00 00:00:00',
        Password: hash_password(req.body.password),
        Token: generate_token(),
        PrivKey: encrypt_private_key(key_pair.private_key, req.body.password),
        PubKey: key_pair.public_key,
        Cookies: datetime,
        TermsOfUse: datetime,
        PrivacyPolicy: datetime,
      }

      let value = [
        [
          user.ID_u,
          user.Created,
          user.LogMail,
          user.Verified,
          user.Password,
          user.Token,
          user.PrivKey,
          user.PubKey,
          user.Cookies,
          user.TermsOfUse,
          user.PrivacyPolicy,
        ]
      ]

      decrypted_private_key = decrypt_private_key(user.PrivKey, req.body.password)

      req.session.mail = user.LogMail
      req.session.token = user.Token
      req.session.private_key = decrypted_private_key

      console.log(decrypted_private_key)

      if (req.body.stay) {
        res.cookie('mail', user.LogMail, {
          maxAge: 1000 * 86400 * 14,
          httpOnly: true
        });
        res.cookie('token', user.Token, {
          maxAge: 1000 * 86400 * 14,
          httpOnly: true
        });
        res.cookie('private_key', decrypted_private_key, {
          maxAge: 1000 * 86400 * 14,
          httpOnly: true
        })
      }

      connection.query('INSERT INTO u (ID_u, Created, LogMail, Verified, Password, Token, PrivKey, PubKey, Cookies, TermsOfUse, PrivacyPolicy) VALUES (?)', value, (err, rows, fields) => {
        if (err) throw err
      })

      res.redirect('/profile') // THE SCRIPT BREAKS HERE
      return
    }
  })
})

当我现在通过单击 /signup 页面上的提交按钮调用此路由时,代码会运行到标记点(带有“THE SCRIPT BREAKS HERE”的点),然后我的浏览器只显示 502 Bad Gateway,但 URL 不会更改为 /profile,浏览器只会显示此消息。

我也没有在控制台中收到任何错误代码或任何内容,它只是在那里中断,如果我在res.redirect('/profile')return 之前或之间执行console.log 然后它会打印到控制台,但我没有收到任何错误,我不知道这是什么,甚至不知道在这种情况下我可以用谷歌搜索什么......

【问题讨论】:

  • 是否正确地将记录插入数据库?
  • 是的,数据显示在数据库中,每次我做另一个测试时,我都必须删除记录,因为那个电子邮件有一条记录,当我查找时,另一个数据看起来也不错
  • 我发现,它与我设置res.cookie('private_key', ...) 的行有关。当我将其注释掉时,我 - 至少 - 被重定向到所需的站点,但我不知道它有什么问题

标签: javascript node.js express redirect


【解决方案1】:

我想我现在已经弄明白了(但我会把你的任何新信息告诉我)。

事情似乎是,我试图将整个 RSA 私钥放入 cookie 中,大多数浏览器似乎无法处理。

这似乎与 cookie 可以存储的数据量有关。在大多数浏览器上,cookie 可以存储大约 4096 个字节,但 RSA 私钥似乎占用了更多空间(即使 strlen 函数给了我 3433 个字符(我假设也是 3433 个字节,至少我记得关于 ASCII 和Unicode))。

如果您有任何想法,无论我的建议是否正确,或者是由其他原因引起的,请添加评论。

除了将 RSA 密钥拆分并保存在两个单独的 cookie 中之外,还有更好的存储 RSA 密钥的方法吗?

【讨论】:

  • 是的,cookie 的大小有限:stackoverflow.com/questions/52203972/…
  • 好的,但是当我将字符串分成两半(1717 字节而不是 3434 字节)并将它们都保存在两个 cookie 中时,它仍然没有保存它们,崩溃仍然发生,我可以似乎没有找到解决方案...
  • 您是否阅读了第一个答案下方的 cmets?浏览器对 Set-Cookie: 标头的大小也有限制。
猜你喜欢
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多