网站首页 > 技术文章 正文
概述:JSON Web Token(JWT)是一种用于安全传输信息的标准。主要用于身份验证和信息传递,通过头部、载荷和签名构成。在.NET Core中,可通过Microsoft.AspNetCore.Authentication.JwtBearer实现后台服务,提供生成、刷新和验证Token的接口。前端使用Vue.js结合axios发送请求,通过拦截器实现自动刷新Token,确保安全可靠的身份验证和信息传递。
什么是JWT?
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间传输信息的轻量级、自包含的标准。JWT由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。它通常被用于身份验证和信息传递。
- 头部(Header):声明类型和使用的签名算法。
{ "alg": "HS256", "typ": "JWT" }
- 载荷(Payload):包含声明(claims),是关于实体(通常是用户)和其他数据的声明。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
- 签名(Signature):使用密钥对头部和载荷进行签名,以确保数据的完整性和来源验证。
JWT 主要用途
JWT主要用于在网络应用中安全地传递声明。常见用途包括身份认证和信息交换。生成的JWT可以被验证,信任,并且不易被篡改。
JWT 的原理
JWT的原理基于对称或非对称加密。生成JWT时,使用密钥对头部和载荷进行签名。验证时,接收到的JWT通过相同的过程重新计算签名,并与接收到的签名进行比较。由于签名使用密钥生成,只有拥有密钥的一方才能生成有效的签名。
JWT 应用场景
- 身份认证:用户登录后,服务器生成JWT,并在每个后续请求中携带JWT,以验证用户身份。
- 信息传递:JWT可以包含任意信息,用于在不同系统之间安全传递信息,如用户权限、配置信息等。
JWT 有哪几种传输方式
- HTTP Header:JWT通常放在HTTP请求的Authorization头部中,使用Bearer方案,例如:Authorization: Bearer your_token_here。
- URL 参数:可以将JWT作为URL的查询参数传递。
- POST 请求体:可以将JWT放在POST请求体中进行传递。
在 .NET Core 中使用 JWT
后台服务实现
- 安装 NuGet 包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 配置 JWT 服务:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
- 添加授权中间件:
app.UseAuthentication();
- 生成 Token 接口:
[ApiController]
[Route("api/auth")]
public class AuthController : ControllerBase
{
private readonly JwtService _jwtService;
public AuthController(JwtService jwtService)
{
_jwtService = jwtService;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
// 验证用户名和密码,生成 ClaimsIdentity
ClaimsIdentity identity = ...
// 生成 JWT
string token = _jwtService.GenerateToken(identity);
return Ok(new { Token = token });
}
}
- 刷新 Token 接口:
[Authorize]
[HttpPost("refresh")]
public IActionResult RefreshToken()
{
// 从当前用户的 Claims 中获取信息,生成新的 Token
ClaimsIdentity identity = ...
string newToken = _jwtService.GenerateToken(identity);
return Ok(new { Token = newToken });
}
- 验证 Token 接口:
[Authorize]
[HttpGet("protected")]
public IActionResult ProtectedResource()
{
// 受保护的资源
return Ok(new { Message = "This is a protected resource." });
}
前端 VUE 实现
- 安装 axios:
npm install axios
- 在 Vue 组件中使用 JWT:
import axios from 'axios';
// 每次请求前检查 Token 是否过期,如果过期则刷新
axios.interceptors.request.use(async (config) => {
const token = localStorage.getItem('jwtToken');
if (token) {
// 检查 Token 是否过期
const decodedToken = parseJwt(token);
const currentTimestamp = Math.floor(Date.now() / 1000);
if (decodedToken.exp < currentTimestamp) {
// Token 过期,刷新 Token
await refreshToken();
}
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 刷新 Token
async function refreshToken() {
const token = localStorage.getItem('jwtToken');
const response = await axios.post('api/auth/refresh', null, { headers: { Authorization: `Bearer ${token}` } });
const newToken = response.data.Token;
localStorage.setItem('jwtToken', newToken);
}
// 发送包含 JWT 的请求
async function sendRequest() {
try {
const response = await axios.get('api/auth/protected');
console.log(response.data);
} catch (error) {
console.error('Request failed:', error);
}
}
// 解析 JWT
function parseJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
以上是一个简单的示例,实际应用中需要考虑更多的安全性和错误处理。确保在生产环境中使用 HTTPS 以保障数据传输的安全性。
猜你喜欢
- 2024-12-28 基于bootstrap实现的,后台内部管理系统整站前端源码,功能齐全
- 2024-12-28 本人后台开发,前端说改个东西要两天,但我感觉撑死2小时
- 2024-12-28 微信公众号疑似故障,前端后台均无法正常使用
- 2024-12-28 免费开源中后台模版,主流技术开发,开箱即用中后台前端解决方案
- 2024-12-28 基于 Vue3+Vite+Antd 企业级中后台管理
- 2024-12-28 vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总
- 2024-12-28 前端和后端哪个工资高? 程序员前端和后端哪个工资高
- 2024-12-28 一个后台兼容两种前端框架(SpringCloud+React / Vue)
- 2024-12-28 后台开发进阶!白话DDD从入门到实践
- 2024-12-28 免费开源的中后台模版,使用主流技术,开箱即用的前端解决方案
你 发表评论:
欢迎- 500℃几个Oracle空值处理函数 oracle处理null值的函数
- 494℃Oracle分析函数之Lag和Lead()使用
- 493℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 481℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 473℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 468℃【数据统计分析】详解Oracle分组函数之CUBE
- 453℃Oracle有哪些常见的函数? oracle中常用的函数
- 448℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
-
- Spring Boot跨域难题终结者:3种方案,从此告别CORS噩梦!
- 京东大佬问我,SpringBoot为什么会出现跨域问题?如何解决?
- 在 Spring Boot3 中轻松解决接口跨域访问问题
- 最常见五种跨域解决方案(常见跨域及其解决方案)
- Java Web开发中优雅应对跨域问题(java跨域问题解决办法)
- Spring Boot解决跨域最全指南:从入门到放弃?不,到根治!
- Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
- Spring Cloud 轻松解决跨域,别再乱用了
- Github 太狠了,居然把 "master" 干掉了
- IntelliJ IDEA 调试 Java 8,实在太香了
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)