node.js - 使用 JWT ,如何设置并使用它进行身份验证?
问题描述
示例场景:-
我在前端使用 HTML 和 JS。对于后端,我使用 Express 。对于身份验证,我使用的是 JWT 。
我知道的基本事情是,当 JWT 被发送回服务器时,它通常设置在 Authorization 标头中。
我想要的是 :-
让我们假设客户端请求的 post /user/login 路由通过 form 提供他们的凭据。Auth 中间件将验证凭据并使用一些有效负载生成 jwt 令牌。
我的问题从这里开始,如何在客户端设置此 jwt 并将其返回到标题中,同时将用户导航到经过身份验证的页面,我希望用户在成功登录时重定向。
如下所示:-
app.post('/user/login' , authMiddleware , async (req , res) => {
res.redirect('/user/createTask')
}
假设 /user/createTask 期待 jwt ,它将在让用户进入路由之前对其进行验证。
那么在 authMiddleware 中必须有什么,以便 jwt 在客户端的本地存储或某处设置,然后在 Authorization 标头中取回它。
如果客户端有事情要做以使其工作,请也提出建议。这整个场景将如何运作?
解决方案
如果您通过表单发送凭据,那么您在发送重定向响应时将无法捕获响应。重定向将由浏览器处理,您的 JS 将无法访问您在响应中发送的任何内容。
要使此方案起作用,您必须post /user/login
通过 javascript 调用端点。然后您可以收到来自您的服务器的响应。从中读取任何标记(例如可以在响应的正文中),将标记设置在存储中的某个位置,然后调用/user/createTask
端点。如果要使用在Authorization
标头中发送的 JWT,则必须通过 javascript 调用所有端点。浏览器无法Authorization
向请求添加标头。您可以将令牌存储在 cookie 中(登录的响应可以设置 cookie),然后浏览器会将 cookie 与请求一起发送。
推荐阅读
- oracle - ORA-00923: 在预期的地方找不到 FROM 关键字,AS 子句中的参数
- postgresql - Flask docker 容器无法连接到 Digital Ocean 中的 Postgresql 容器
- java - Android:第一个视图中的 RadioGroup OnCheckedChangeListener 添加 for 循环不起作用
- enums - 如何在 SwiftUI 中使用枚举绑定数据?
- html - 带有垂直线的时间线和上面的点未对齐
- matlab - 找出向量元素之间的差异
- mysql - mysql - 当我们可以为 mysql 使用 docker 镜像时为什么还需要 RDS
- node.js - proto3如何设置map类型的值
- wifi-direct - 如何在控制台程序中直接使用 WiFi?
- python - 强制 Selenium 从旧的 ChromeDriver 版本开始