API 身份認證還得看我 JWT

JWT(JSON Web Token)是一種用於身份認證的開放標準(RFC 7519),它可以在網絡應用間傳輸信息作爲 JSON 對象。JWT 由三部分組成:頭部(Header)、載荷(Payload)和簽名(Signature)。

頭部(Header):頭部通常由兩部分組成,令牌的類型(即 JWT)和所使用的簽名算法,例如:

{
  "alg""HS256",
  "typ""JWT"
}

載荷(Payload):載荷包含要傳輸的信息,可以包括用戶的身份信息、權限等。載荷可以自定義,但建議避免包含敏感信息。例如:

{
  "sub""1234567890",
  "name""John Doe",
  "iat"1516239022
}

簽名(Signature):簽名用於驗證令牌的完整性和真實性,通常通過使用頭部和載荷中的數據以及一個密鑰進行加密生成。例如:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

JWT 的工作流程如下:

用戶提供用戶名和密碼進行身份認證。

服務器驗證用戶名和密碼的正確性。

服務器使用私鑰簽發 JWT,並將其發送給客戶端。

客戶端將 JWT 存儲在本地,例如在瀏覽器的 localStorage 中。

客戶端在後續的請求中使用 JWT 進行身份認證,將其放在請求的頭部或其他位置。

服務器接收到請求後,使用公鑰驗證 JWT 的合法性和完整性。

如果 JWT 通過驗證,服務器可以根據載荷中的信息進行授權和權限驗證。 JWT 的優點包括不需要在服務器端存儲會話信息、可擴展性好、跨語言和跨平臺支持等。但需要注意的是,由於 JWT 是基於對稱或非對稱加密的,因此需要妥善保管密鑰,以防止令牌被篡改。

在 ASP.NET Core 中,可以使用 Microsoft.AspNetCore.Authentication.JwtBearer 包來實現 JWT 的身份認證。下面是一些基本的步驟:

安裝包:在項目中安裝 Microsoft.AspNetCore.Authentication.JwtBearer 包。

配置身份認證服務:在 Startup.cs 文件的 ConfigureServices 方法中添加以下代碼,以配置 JWT 身份認證服務。

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
// ...
public void ConfigureServices(IServiceCollection services)
{
    // ...
    // 添加身份認證服務
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = "your_issuer",
                ValidAudience = "your_audience",
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
            };
        });
    // ...
}

配置身份認證中間件:在 Startup.cs 文件的 Configure 方法中添加以下代碼,以配置身份認證中間件。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...
    app.UseAuthentication();
    // ...
    app.UseAuthorization();
    // ...
}

控制器中使用身份認證:在需要進行身份認證的控制器或操作方法上添加 [Authorize] 標籤。

[ApiController]
[Route("api/[controller]")]
[Authorize]
public class MyController : ControllerBase
{
    // ...
}

生成 JWT:在用戶登錄成功後,可以使用 System.IdentityModel.Tokens.Jwt 包來生成 JWT。可以在登錄控制器的操作方法中添加以下代碼:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
// ...
[HttpPost("login")]
public IActionResult Login(string username, string password)
{
    // 驗證用戶名和密碼
    // 生成 JWT
    var tokenHandler = new JwtSecurityTokenHandler();
    var key = Encoding.UTF8.GetBytes("your_secret_key");
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new Claim[]
        {
            new Claim(ClaimTypes.Name, username)
        }),
        Expires = DateTime.UtcNow.AddHours(1),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
    };
    var token = tokenHandler.CreateToken(tokenDescriptor);
    var tokenString = tokenHandler.WriteToken(token);
    return Ok(new { Token = tokenString });
}

以上是基本的實現步驟,通過配置 JWT 身份認證服務和中間件,以及使用 [Authorize] 標籤來保護需要認證的資源,即可實現 JWT 的身份認證功能。在生成 JWT 的過程中,可以根據需要設置有效期、加密算法等參數。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Qoe4ZYtO2bSVzecRT1DG-g