JWT(JSON Web Token)の使用方法

JWTの基本構造

JWT(JSON Web Token)はJSON形式で構成されるセキュリティトークンで、ネットワーク上で安全に情報を交換するための仕組みです。主に以下の3つの部分で構成されます:

  • ヘッダー(暗号化方式の指定)
  • ペイロード(有効期限やユーザー情報などのデータ)
  • シグネチャ(署名情報)

.NET Coreでの実装手順

1. 設定ファイルの追加

appsettings.jsonにJWTの設定を追加します:


{
  "JwtConfig": {
    "Issuer": "https://api.example.com",
    "Audience": "https://api.example.com",
    "SecurityKey": "abcdefghijk12345"
  }
}

2. 設定クラスの作成


public class JwtConfiguration
{
    public string Issuer { get; set; }
    public string Audience { get; set; }
    public string SecurityKey { get; set; }
}

3. 認証サービスの設定

Startup.csでの認証ミドルウェアの構成:


public void ConfigureServices(IServiceCollection services)
{
    services.Configure<JwtConfiguration>(
        Configuration.GetSection("JwtConfig"));
    
    var config = new JwtConfiguration();
    Configuration.Bind("JwtConfig", config);

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = config.Issuer,
            ValidAudience = config.Audience,
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(config.SecurityKey))
        };
    });
}

4. トークン発行APIの実装


[ApiController]
[Route("[controller]")]
public class TokenController : ControllerBase
{
    private readonly JwtConfiguration _config;

    public TokenController(IOptions<JwtConfiguration> options)
    {
        _config = options.Value;
    }

    [HttpGet]
    public IActionResult GetToken(string user, string pass)
    {
        // 認証ロジック(簡易版)
        if (user != "testuser" || pass != "password123")
            return Unauthorized();

        // クレームの作成
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, "1234567890"),
            new Claim(ClaimTypes.Role, "user")
        };

        // 暗号鍵の生成
        var key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(_config.SecurityKey));

        // トークンの構築
        var token = new JwtSecurityToken(
            issuer: _config.Issuer,
            audience: _config.Audience,
            claims: claims,
            expires: DateTime.Now.AddMinutes(15),
            signingCredentials: new SigningCredentials(
                key, SecurityAlgorithms.HmacSha256)
        );

        return Ok(new { 
            token = new JwtSecurityTokenHandler().WriteToken(token) 
        });
    }
}

5. 認証の適用方法

コントローラーに[Authorize]属性を追加することで認証を適用:


[ApiController]
[Route("[controller]")]
[Authorize]
public class SecureController : ControllerBase
{
    // すべてのアクションで認証が必要
    [HttpGet]
    [AllowAnonymous] // 特定アクションのみ匿名アクセスを許可
    public IActionResult PublicData()
    {
        return Ok("公開データ");
    }
}

タグ: .NET Core JWT 認証 APIセキュリティ

5月18日 19:41 投稿