为什么选 JWT
在前后端分离的项目里,JWT 是最常见的认证方案之一。它把用户身份编码到一个自包含的 token 里,服务器无需维护 session 状态,天然适合分布式部署。
但 JWT 不是银弹。它有三个必须正视的问题:
- token 一旦签发无法吊销,除非维护 blacklist
- payload 可被解码(base64 不是加密),不能放敏感信息
- 过期时间权衡:短则频繁登录,长则安全风险
后端:.NET 8 配置
在 Program.cs 里加入 JWT 认证:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
前端:Nuxt 3 拦截器
在 Nuxt 里用 useFetch 的 onRequest 钩子统一注入 token:
export const useApi = () => {
const token = useCookie('auth-token')
return $fetch.create({
baseURL: useRuntimeConfig().public.apiBase,
onRequest({ options }) {
if (token.value) {
options.headers = {
...options.headers,
Authorization: `Bearer ${token.value}`
}
}
},
onResponseError({ response }) {
if (response.status === 401) {
navigateTo('/login')
}
}
})
}
刷新 token 的陷阱
很多教程只讲 access token,不讲 refresh token。实际生产环境里,没有 refresh token 的 JWT 方案是不完整的。
关键设计:
- access token:15 分钟有效期,放在内存或 cookie
- refresh token:7 天有效期,必须 HttpOnly cookie,防止 XSS 窃取
- 刷新接口:服务端校验 refresh token,签发新的 access token
总结
JWT 认证看似简单,但实际落地有不少细节。希望这篇文章能帮你避开常见的坑。