【发布时间】: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