为什么选 JWT

在前后端分离的项目里,JWT 是最常见的认证方案之一。它把用户身份编码到一个自包含的 token 里,服务器无需维护 session 状态,天然适合分布式部署。

但 JWT 不是银弹。它有三个必须正视的问题:

  1. token 一旦签发无法吊销,除非维护 blacklist
  2. payload 可被解码(base64 不是加密),不能放敏感信息
  3. 过期时间权衡:短则频繁登录,长则安全风险

后端:.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 里用 useFetchonRequest 钩子统一注入 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 认证看似简单,但实际落地有不少细节。希望这篇文章能帮你避开常见的坑。