Web开发—实现JWT登录鉴权
一、前言
JWT(JSON Web Token)是一种用于在网络上传输信息的开放标准(RFC 7519),通常被用来在网络应用间安全地传递信息。JWT一个关键特点是,接收方可以验证令牌的完整性,即使信息不是加密的,接收方也可以确保信息没有被篡改。因此,JWT在身份验证和信息交换方面得到广泛应用,特别是在Web开发中的用户认证、单点登录(SSO)等场景。
JWT由三部分组成: 头信息(header), 载荷(payload), Signature(签名)。
Header: 包含了关于令牌的元数据以及使用的签名算法。它通常包括两个部分:alg(指定签名算法)和 typ(指定令牌类型)。
1
2
3
4{
"alg": "HS256",
"typ": "JWT"
}Payload: 包含了要传递的信息。它包括一些标准的声明,以及自定义的声明。标准的声明包括 iss(签发者)、sub(主题)、aud(接收者)、exp(过期时间)、nbf(生效时间)、iat(签发时间)等。
1
2
3
4
5{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}Signature: 使用头部中指定的算法和密钥对头部和负载进行签名。签名用于验证消息的完整性和发送者的身份。
1
2
3
4
5HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
二、JWT的使用流程
使用JWT进行Web开发时,通常的步骤涉及创建、发送和验证JSON Web Tokens。
1.生成JWT
- 使用第三方库,例如jsonwebtoken(对于Node.js),也可以使用别的库:https://jwt.io/libraries。
- 选择适当的算法和密钥来签名令牌
1 | const jwt = require('jsonwebtoken'); |
2.发送JWT
- 将生成的JWT添加到请求头部(通常是Authorization头)或者作为请求参数发送给服务器。
- 在前端中使用 AJAX 请求或 Fetch API,确保将JWT添加到请求中。
1 | // Using Fetch API |
3.验证JWT
- 在服务器端设置中间件或拦截器来验证传入的JWT。
- 使用服务器端的密钥来验证JWT的签名,并检查有效期等声明。
1 | // Sample middleware using Express.js |
4.处理JWT的响应
根据服务器响应处理 JWT,例如存储令牌以备将来使用。
1 | // Assuming response contains a JWT |
注:存储令牌时需要谨慎处理,最好是使用安全的存储方式,例如将JWT存储在HttpOnly的Cookie中,以减少CSRF攻击的风险。
三、JWT鉴权在ThinkJS中的实践
1.通过npm安装jsonwebtoken
模块
1 | npm install jsonwebtoken |
2.创建JWT鉴权中间件
1 | // middleware/jwtAuth.js |
3.在src/config/middleware.js
中配置中间件
1 | // src/config/middleware.js |
4.在需要JWT鉴权的路由中使用中间件
1 | // src/config/router.js |
5.在控制器中处理受保护的端点,通过ctx.state.user
来访问用户信息
1 | // src/controller/api.js |
注:以上代码中的密钥
secretKey
是示例,实际开发中应该使用更复杂的密钥。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 彗星来了!
评论