Merhaba arkadaşlar, bu yazımda sizlere .Net Core API JsonWebToken(JWT) Kullanımı konusundan bahsedeceğim.
JsonWebToken(JWT) bir token biçimidir. IETF kuruluşu tarafından tasarlanmıştır. Jwt, base64 şeklinde bir token olarak karşımıza gelir. Bu token içerisinde de belli başlı bilgiler tutulmaktadır.
JWT Yapısı?
Jwt 3 kısımdan oluşur. Bunlar Header, Payload, Signature olarak ayrılmıştır. Üretilen token bilgisini kontrol ettiğimizde ilk noktaya kadar olan kısım Header bilgilerini tutar. İkinci noktaya kadar olan kısım Payload(Veri) bilgilerini tutar. Son kısım ise Signature bilgilerini tutar.
Örnek bir Jwt Token:
Jwt ile ilgili token bilgimizi kontrol etmek istersek eğer https://jwt.io/ adresine gidebiliriz.
Header(Başlık)
JWT ile oluşturulan ilk kısımdır. Header kısmında 2 bilgi vardır. Bunlar Token’ın Hash algoritmasını ve tipini belirtmektedir.
Payload(Veri)
Payload, içerisinde kullanıcıya ait bilgileri, zaman aşımı ve kullanıcı yetkileri gibi bilgiler yer alır. Bu kısımda veriler istemci ve sunucu arasında paylaşılır ve eşsiz olmalıdır.
Signature(İmza)
Bu kısım JWT’nin imzasıdır. İmza kısmı token bilgisinin üreticisi ve token tüketicisi arasındaki veri bütünlüğünü garanti eder.
.Net Core ile Jwt Token Nasıl Oluşturulur?
Öncelikle .Net Core ile bir API projesi oluşturuyoruz. JWT token oluşturma işlemlerimizi API üzerinde gerçekleştireceğiz. Projemizi oluşturduktan sonra JWT ile ilgili paketimizi Nuget Package Manager üzerinden yükleyeceğiz. Sonrasında da bir controller dosyası oluşturacağız ve token oluşturabileceğimiz endpoint için gerekli kodlarımızı yazacağız.
Projemizde gerekli modellerimizi oluşturuyoruz. Bunlardan birisi LoginModel, diğeri de LoginResultModel.
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
public class LoginResultModel
{
public string Token { get; set; }
public DateTime Expiry { get; set; }
}
Modelleri oluşturduktan sonra da AuthController isminde bir Controller oluşturuyoruz. İçerisinde de login endpointimizi ve token oluşturmak için kullanacağımız metotlarımızı yazıyoruz. Appsettings.json dosyamızdan veri okumak için de controller içerisinde IConfiguration nesnemizi kullanıyor olacağız. Appsettings.json dosyamızda JWT ile ilgili bilgilerimizin tanımlamasını yazacağız.
Appsettings.json
{
"Jwt": {
"Key": "custom jwt security key bla bla bla...",
"Issuer": "NetCoreAPIJwtSample",
"Audience": "NetCoreAPIJwtSample",
"Subject": "NetCoreAPIJwtSample"
}
}
AuthController.cs
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("login")]
public IActionResult Login(LoginModel model)
{
if(model.Username == "admin" && model.Password == "1234")
{
var tokenResult = GenerateToken(model.Username);
return Ok(tokenResult);
}
return BadRequest("Kullanıcı adı veya şifre yanlış!");
}
private LoginResultModel GenerateToken(string username)
{
var claims = GenerateUserClaims(username);
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expiry = DateTime.Now.AddMinutes(10);
var token = new JwtSecurityToken(_configuration["Jwt:Issuer"], _configuration["Jwt:Audience"], claims, expires: expiry, signingCredentials: signIn);
LoginResultModel loginResult = new()
{
Token = new JwtSecurityTokenHandler().WriteToken(token),
Expiry = expiry
};
return loginResult;
}
private Claim[] GenerateUserClaims(string username)
{
return new[] {
new Claim(JwtRegisteredClaimNames.Sub, _configuration["Jwt:Subject"]),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
new Claim("Username", username),
};
}
}
GenerateToken metodumuzun içerisinde Token süresi, key bilgisi gibi değerlerimizi belirttik. LoginResultModel içerisinde bulunan Token property’mize de JwtSecurityTokenHandler().WriteToken(token) metodunu kullanarak atama işlemini gerçekleştirdik. Böylelikle token bilgimiz oluşturuldu ve nesnemizdeki Token değerine atandı. Login endpointimize kullanıcı bilgilerimizde istek attığımız zaman ise başarılı bir şekilde oluşturmuş olacaktır.
Oluşturulan Token Bilgisi
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJOZXRDb3JlQVBJSnd0U2FtcGxlIiwianRpIjoiMDcxY2VjYjYtZGE4ZC00MzNmLWIyNDEtMWQyNmJhODhlMjAwIiwiaWF0IjoiNi4xMS4yMDIyIDEyOjExOjQ1IiwiVXNlcm5hbWUiOiJhZG1pbiIsImV4cCI6MTY2NzczNzMwNSwiaXNzIjoiTmV0Q29yZUFQSUp3dFNhbXBsZSIsImF1ZCI6Ik5ldENvcmVBUElKd3RTYW1wbGUifQ.dVx_-5RT3f0pSLsi9AGwGW_xDdNfWVY_lPEiDV7mrnM",
"expiry": "2022-11-06T15:21:45.7224835+03:00"
}
JWT ile token oluşturma işlemleri yukarıdaki gibi yapılabilir.
Umarım faydalı olur.
Bir sonraki yazıda görüşmek üzere…