概述:JSON Web Token(JWT)是一種用於安全傳輸信息的標準。主要用於身份驗證和信息傳遞,通過頭部、載荷和簽名構成。在.NET Core中,可通過Microsoft.AspNetCore.Authentication.JwtBearer實現後臺服務,提供生成、刷新和驗證Token的介面。 ...
概述: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 以保障數據傳輸的安全性。