jwt token 流程讲解

本文介绍了一种结合JWT与Ajax的认证流程设计方案,包括认证管理器的配置、自定义认证提供者的绑定、路径配置及过滤器的应用等。此外,还详细讲解了客户端请求处理过程,从登陆请求到JWT令牌的生成与验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1。启动项目,首先初始化WebSecurityConfig中的认证管理器
然后给认证管理器绑定提供者
第一个为自定义的ajax认证提供,第二个为jwt认证提供
2.重写WebSecurityConfigurerAdapter的配置项,为自己需要的进行配置

配置不需要携带token进行认证的路径
认证请求对登陆和刷新token放行,可以自定义添加更多不需要携带token的路径
然后对其他的路径都要求携带token
在认证token之前需要执行以下过滤器
(1)当执行登陆时,执行ajax登陆过滤器
传人登陆时的路径,成功后的处理器和失败后的处理器,以便于做不同的处理
(2)当执行其他路径时,调用jwt认证过滤器
设置需要跳过的token认路径和需要认证的路径
然后将失败处理器和TokenExtractor还有设置好的跳过请求路径认证类一起交给JwtTokenAuthenticationProcessingFilter
进行过滤,JwtTokenAuthenticationProcessingFilter会调用JwtHeaderTokenExtractor用于从头提取授权令牌
可以扩展TokenExtractor接口并提供您的自定义实现,例如从URL提取令牌
到此WebSecurityConfig配置完成
3.客户端发送post请求到SystemManagerController/userLogin执行登陆请求以ajax方式,将用户名和密码封装为json格式
此处不是必须ajax和json,可以进行更改,一般配合security为ajax和json
请求发出后先由跨域过滤器进行跨域响应参数处理CORSFilter
客户端每次都会先发送一次options请求,进行跨域试探性请求
接着进入AjaxLoginProcessingFilter进行登录过滤处理

如果为options请求直接返回,接着会立即再发送一份客户端原始请求
这里为post请求
接下来认证处理器会找到认证提供类AjaxAuthenticationProvider进行密码和账户的认证
此处处理业务逻辑,如果账户和密码比对成功则执行
创建的UserContext和你所需要的用户数据来填充它
认证成功后执行AjaxAwareAuthenticationSuccessHandler委托创建JWT令牌

进行创建token和传送需要的值
认证成功处理器会调用JwtTokenFactory工厂同时创建token和创建刷新token
token采用三段式
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
头部声明加密的算法 这里采用的HS521,可以是其他的加密方式如HMAC SHA256
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
第二部分为载荷部分
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
  • 标准中注册的声明
  • 公共的声明
  • 私有的声明
标准中注册的声明 (建议但不强制使用) :
  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
在本项目中只用了其中的一小部分
然后将其进行base64加密,得到Jwt的第二部分。
第三部分是一个签证信息,这个签证信息由三部分组成:
  • header (base64后的)
  • payload (base64后的)
  • secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
将这三部分用.连接成一个完整的字符串,构成了最终的jwt:
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
服务端完成响应,得到结果如下:
4.返回token后每次请求服务器都要带着token进行认证
当我们请求服务器时,需要携带自定义请求头
并且自定义认证请求头 的value值都需要以GuoAn 开头
请求同样会进行一次跨域试探
然后交由JwtTokenAuthenticationProcessingFilter进行认证

然后利用JwtHeaderTokenExtractor 从头提取令牌。然后交由JwtAuthenticationProvider 进行
验证访问令牌的签名
从Access令牌中提取身份和授权声明,并使用它们创建UserContext
如果访问令牌格式错误,过期或简单地如果令牌没有使用适当的签名密钥签名,则将抛出身份验证异常

认证成功后调用JwtTokenAuthenticationProcessingFiltersuccessfulAuthentication方法
最后响应到前台,至此结果完成
<think>好的,用户需要关于JWT实现Token登录验证的文档、教程或示例。首先,我需要整理已有的引用内容,看看哪些可以直接用到。引用1提到node-jsonwebtoken库用于Koa服务的token验证,引用3和4讨论了JWT在微服务中的应用场景和安全策略,引用5提到服务器解析JWT令牌获取用户信息。用户的问题集中在登录验证的实现步骤和示例上。 接下来,我应该分步骤讲解JWT的实现流程。第一步是生成Token,需要引入库,设置密钥和过期时间,然后在登录成功后签发Token。这里可以给出代码示例,比如使用jsonwebtoken.sign方法。第二步是客户端存储Token,通常放在Authorization头里,用Bearer模式。第三步是服务器验证,中间件如何截取并验证Token,处理无效或过期的情况,比如使用jsonwebtoken.verify。 然后,需要补充安全性注意事项,比如HTTPS、密钥保护、刷新机制,引用3提到的双Token策略可以在这里提及。最后给出完整示例,整合登录接口和中间件,展示整个流程。相关的问题部分可以引导用户了解更多优化方法和安全策略,引用中的内容可以作为扩展阅读推荐。 需要确保所有代码示例正确,并符合用户的技术栈,比如Koa和node-jsonwebtoken。同时,要检查引用是否正确对应,例如双Token策略来自引用3,存储方式参考引用4和5。可能用户需要具体的实现细节,所以步骤要清晰,代码要有注释,避免术语过多,保持易懂。最后提醒用户注意密钥管理和刷新机制,确保他们了解安全最佳实践。</think>### JWT实现Token登录验证的完整流程 ### 一、核心实现步骤 1. **生成Token** ```javascript const jwt = require('jsonwebtoken'); const SECRET_KEY = 'your-256-bit-secret'; // 推荐使用环境变量存储 const EXPIRES_IN = '1h'; // 有效期设置 // 登录成功后生成Token function generateToken(user) { return jwt.sign( { userId: user.id, role: user.role }, // payload SECRET_KEY, { expiresIn: EXPIRES_IN } ); } ``` 通过`jsonwebtoken.sign`方法生成包含用户信息的加密令牌[^1] 2. **客户端存储** ```http Authorization: Bearer <token> // 推荐在请求头中携带[^4] ``` 前端应在登录成功后存储到`localStorage`或`cookie`,注意设置`httpOnly`和`secure`标志[^5] 3. **服务器验证** ```javascript // Koa中间件示例 async function jwtMiddleware(ctx, next) { const token = ctx.headers.authorization?.split(' ')[1]; if (!token) { ctx.throw(401, 'No token provided'); } try { ctx.state.user = jwt.verify(token, SECRET_KEY); await next(); } catch (err) { ctx.throw(401, 'Invalid token'); } } ``` 使用`jwt.verify`解析并验证令牌有效性[^2] ### 二、安全性增强措施 1. **HTTPS强制使用** 2. **密钥轮换机制**(推荐HS256→RS256非对称加密) 3. **黑名单管理**(针对提前失效的Token) 4. **双Token策略**(Access Token + Refresh Token)[^3] ```javascript // 生成双Token const accessToken = jwt.sign(payload, SECRET, { expiresIn: '15m' }); const refreshToken = jwt.sign({ userId: payload.userId }, REFRESH_SECRET, { expiresIn: '7d' }); ``` ### 三、完整示例(Koa) ```javascript // app.js const Koa = require('koa'); const jwt = require('jsonwebtoken'); const router = require('koa-router')(); const SECRET = 'your-secret-key'; router.post('/login', async (ctx) => { // 1. 验证用户凭证 const user = await validateUser(ctx.request.body); // 2. 生成Token const token = jwt.sign( { userId: user.id, username: user.name }, SECRET, { expiresIn: '1h' } ); ctx.body = { token }; }); router.get('/protected', jwtMiddleware, async (ctx) => { ctx.body = { message: `欢迎 ${ctx.state.user.username}`, userData: ctx.state.user }; }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值