首页 > 解决方案 > 如何将令牌从服务器发送到客户端?

问题描述

我有快速应用程序,在端口 8000 上运行,我也在端口 3000 上做出反应。我正在尝试实现 google oauth。

这就是我所做的。

我尝试将获取请求发送到我的 api 端点,然后我的快速服务器将用户重定向到谷歌登录。

在此处输入图像描述

然后,如何从get请求中将令牌从服务器发送到客户端?这是我的快速代码。我尝试直接从服务器发送 cookie,但我不知道为什么 cookie 在端口 3000 上不可用,这是我的反应应用程序。有什么巧妙的方法可以将 jwt 发送给客户端吗?

router.get(
  "/google/callback",
  passport.authenticate("google", {
    scope: ["profile", "email"],
    failureRedirect: "/login",
    session: false,
  }),
  (req, res) => {
    const payload = {
      id: req.user.id,
    };

    jwt.sign(payload, secret, { expiresIn: tokenLife }, (err, token) => {
      if(err) {
        console.log('error', err)
      }
      const jwt = `Bearer ${token}`;
      console.log('ini token', token)

      const htmlWithEmbeddedJWT = `
    <html>
      <script>
        // Save JWT to cookie
        // document.cookie = 'token=${jwt};'
        document.cookie = 'token=${jwt}; SameSite=None; Secure'
        // Redirect browser to root of application
        window.open('http://localhost:3000/login', '_self')
      </script>
    </html>
    `;

      res.send(htmlWithEmbeddedJWT);
    });
  }
);

标签: javascriptnode.jsexpressoauth

解决方案


它不可用,因为您已响应 google 呼叫,然后将客户端上的页面重定向到 localhost,显然 cookie 将不可用。

在这种情况下处理身份验证的常用方法是定义一个成功重定向,该重定向期望在查询参数中接收某种令牌。


推荐阅读