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("公開データ");
}
}