まず、NuGetから以下のパッケージをインストールします:
Microsoft.AspNetCore.Authentication.JwtBearer
1. 認証サービスの登録とミドルウェアの設定
Startup.cs の ConfigureServices メソッド内で JWT Bearer 認証を設定します:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["Jwt:Secret"]))
};
});
次に、Configure メソッドで認証ミドルウェアを有効化します:
app.UseAuthentication();
2. 必要な名前空間の追加
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
using System.Text;
3. トークン生成メソッドの実装
private string GenerateJwtToken(string id, string name)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, id),
new Claim(JwtRegisteredClaimNames.Name, name)
};
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration["Jwt:Secret"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.UtcNow.AddMinutes(120),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
4. コントローラでのログイン処理
[HttpPost]
public IActionResult Login(LoginRequest request)
{
var user = ValidateCredentials(request);
if (user == null)
return Unauthorized();
var jwt = GenerateJwtToken(user.Id, user.Name);
return Ok(new { token = jwt });
}
private User ValidateCredentials(LoginRequest req)
{
// 実際にはデータベースや認証サービスと連携
if (req.Username == "test" && req.Password == "password")
return new User { Id = "123456789", Name = "test" };
return null;
}
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
public class User
{
public string Id { get; set; }
public string Name { get; set; }
}
5. 動作確認
Postman などで /login エンドポイントに POST リクエストを送信し、JWT トークンが正常に発行されることを確認できます。