【问题标题】:Sending jwt to the client in Express在 Express 中向客户端发送 jwt
【发布时间】:2021-04-03 00:35:27
【问题描述】:

首先,让我概述一下我的应用程序,它相当简单。

基本思想是用户在 /Login 页面上的 html 表单中输入他的帐户名和密码,例如:

<form action="/Login" method="post" target="_blank">
  <label for="fname">First name:</label>
  <input type="text" id="name" name="username"><br><br>
  <label for="lname">Last name:</label>
  <input type="text" id="password" name="password"><br><br>
  <input type="submit" value="Submit">
</form>

这按预期工作,它向 /Login 发送用户名和密码的发布请求。 当数据到达服务器时,服务器会检查用户名和密码是否有效,如果它们是新的 JSON Web 令牌将被创建。我使用 npm 库“bcrypt”来验证帐户,使用“jsonwebtoken”来创建令牌。这看起来像这样:

const accessToken = jwt.sign(user, process.env.JSON_TOKEN_SECRET, { expiresIn: "10m" })

用户只是一个对象,具有一个 id 键和一个值,无论帐户名称是什么。如果用户名是 admin,它将如下所示:

const user = { id: "admin" }

所以现在我想将此令牌交付给客户,但我不知道具体如何。我试过了:

res.json({ accessToken })

但这只是在屏幕上显示 JSON。我也尝试过常规 res.send() 但它不会正确地将令牌传递给用户。我想要一个 webtoken 身份验证,这样我就可以在我的项目中使用受保护的路由。如果我想访问受保护的路由,我会收到一个错误,即没有身份验证标头,这可能意味着浏览器没有正确接收到令牌。路由保护只是基本的中间件:

const authHeader = req.headers["authorization"]  //if console logged authHeader is undefined
const token = authHeader && authHeader.split(" ")[1]
jwt.verify(token, process.env.JSON_TOKEN_SECRET, (err, user) => {
        //Some error handling
        next()
})

接下来,我尝试使用 Postman,向 /Login 发出 POST 请求,并在响应正文中获取了我的令牌。我将令牌手动粘贴到 Bearer Authorization 标头中,并向受保护的路由发出 GET 请求,这很有效。

那么我怎样才能正确地将 webtoken 发送给客户端呢?

【问题讨论】:

  • 是的,您使用标准的帖子表单并使用 JSON 进行响应,您应该添加更多逻辑并为 xhr 做出不同的响应。此外,您需要将令牌设置为 cookie,最好使用 secure: true, signed: true然后您可以从req.header 向下级联,否则在制作您的验证/受保护路由中间件时在req.signedCookies 中查找令牌。 不要做其他人建议的事情并存储在本地存储中对 XSS 不安全,通过 HTTPS 使用安全签名的 cookie 或不安全,没有理由客户端需要解码甚至读取身份验证令牌。使用/me 端点

标签: javascript node.js express jwt


【解决方案1】:

当您使用 POST 请求登录时,它总是会发送令牌作为响应,因此请使用一些函数将该响应存储在 localStorage 或 sessionStorage 中,或者在成功登录后您可以发送其他请求以从快速服务器获取令牌。

【讨论】:

    【解决方案2】:

    当用户登录时,您会创建 json Web 令牌。你有一个登录控制器。

      const postLogin=(req,res)=>{
         // you read the req.body, get username,email, password etc
         // then you use email to see if user exists in db
        // if user exists, then you verify the password
        // if everything works so far you create the token
        //  token is kinda locked version of your inputs 
        // when you send it to server, only that server unlocks it with secret-key
        let token;
          try {
            token = jwt.sign({ _id: this._id, email: this.email }, "this-is-secret", {
              expiresIn: "1h",
            });
          } catch (e) {
            throw new Error(e.message);
          }
        res
            .status(200)
            .header("x-auth-token", token)
            .json({ token, userId: existingUser._id.toString() });
      }
    

    x-auth=扩展授权

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多