Kural olarak, yazılım sistemleri gerçek uygulamalarda kullanılıncaya kadar iyi çalışmaz ve defalarca başarısız olur.
- David Parnas
Kural olarak, yazılım sistemleri gerçek uygulamalarda kullanılıncaya kadar iyi çalışmaz ve defalarca başarısız olur.
- David Parnas
Jwt neden gereklidir ?
JWT, sunucu ve istemci arasında Yetkilendirme ve bilgi alışverişi için kullanılır. Gelen isteğin kimliğini doğrular ve güvenlik açısından en iyisi olan REST API'ye ek bir güvenlik katmanı sağlar.
Peki Jwt nasıl çalışır ?
Kullanıcı adı ve şifre gibi kullanıcı bilgileri HTTP GET ve POST istekleri kullanılarak web sunucusuna gönderilir. Web sunucusu, kullanıcı bilgilerini tanımlar ve bir JWT token (jeton) oluşturur ve bunu istemciye geri gönderir. İstemci bu belirteci oturumda saklar ve ayrıca başlığa ayarlar. Bir sonraki HTTP çağrısında, bu belirteç, istemciye yanıtı döndüren sunucu tarafından doğrulanır
Şimdi ise Jwt yi projemize dahil ederek adım adım işlemleri gerçekleştirelim.
1.adım jwt paketini dahil edelim composer require tymon/jwt-auth
2.adım config/app.php içerisine servis bağlayıcısını dahil etmelisiniz.
3.adım providers dizinine dahil ettikten sonra publish etmelisiniz.
4.adım php artisan jwt:secret diyerek bir anahtar key oluşturmalısınız. Oluştuğunda .env dosyanızda en altta eklenmiş olucaktır.
5.adım User modelinizde jwt ye ait fonksionları eklememiz ve implement etmemiz gerekiyor.
6.adım kimlik doğrulama sürecini koruma altına alabilmemiz için Jwt Guardı kullanmamız gerekiyor.
config/auth.php dosyasında guard içerisine api dizisini
'api' => [
'driver' => 'jwt',
'provider' => 'users',
'hash' => false,
],
dahil etmelisiniz.
7.adım controller ve route işlemlerini gerçekleştirelim.
php artisan make:controller AuthController diyerek bir controller oluşturalım.
8.adım login,register, token yenileme,çıkış yapma ve kullanıcı bilgilerini getirmek için fonksiyonları yazalım.
public function login(Request $request)Burada şifre ve email ile oturum açmak isterseniz email, username ile oturum açmak isterseniz parametre olarak username göndermelisiniz.
{
if ($request->email) {
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required|string|min:6',
]);
}
if ($request->username) {
$validator = Validator::make($request->all(), [
'username' => 'required',
'password' => 'required|string|min:6',
]);
}
if ($validator->fails()) {
return MyResponse::error($validator->errors(), 400);
}
if (!$token = auth()->attempt($validator->validated())) {
return MyResponse::error('Bu bilgilere ait bir hesap bulunamamaktadır.',401);
}
if (\auth()->user()->status == false) {
return MyResponse::error('Sorry, you account no active');
}
return $this->respondWithToken($token);
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
'expires_in' => auth()->factory()->getTTL() * 60,
'user' => Auth::user()
]);
}public function profile()
{
return response()->json([
'message' => 'Profile Information',
'user' => \auth()->user()
], 200);
}public function refresh()
{
return $this->respondWithToken(auth()->refresh());
}tokeni yenileme için kullanabilirsiniz
public function logout()
{
try {
auth()->logout();
return MyResponse::success('Logout Successfully', null, 200);
} catch (Exception $e) {
return MyResponse::error('Sorry, something went wrong', 400);
}
}public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'full_name' => 'required|string|min:4|max:100',
'email' => 'required|string|email|max:100|unique:users',
'username' => 'required|string|min:8|max:100|unique:users',
'password' => 'required|string|confirmed|min:8',
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 400);
}
$user = new User();
$user['full_name'] = $request->full_name;
$user['username'] = $request->username;
$user['email'] = $request->email;
$user['password'] = Hash::make($request->password);
$user['email_verification_token'] = Str::random(32);
$user->save();
return response()->json([
'message' => 'Your registration has been successfully completed and an account confirmation e-mail has been sent to you',
'user' => $user
], 201);
}routes içerisinde api.php ye girerek rotaları ekleyeyebilirsiniz.Route::group(['middleware' => 'jwt.verify'], function() {
Route::post('/refresh',[AuthController::class, 'refresh']);
Route::get('/profile', [AuthController::class, 'profile']);
Route::post('/logout', [AuthController::class, 'logout']);
}oturum gerektiren (token) istekleri jwt.verify içerisinde kontrol ediyoruz.
Jwt.verify middleware oluşturmak için php artisan make:middleware JwtVerify diyerek bir middleware oluşturalım ve handle fonksiyonunu bu şekilde güncelleyelim.public function handle(Request $request, Closure $next)
{
try {
JWTAuth::parseToken()->authenticate();
} catch (Exception $e) {
if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
return response()->json(['status' => 'Token is Invalid']);
}else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
return response()->json(['status' => 'Token is Expired']);
}else{
return response()->json(['status' => 'Authorization Token not found']);
}
}
return $next($request);
}ve middleware Kernel.php içerisinde routeMiddleware dizisi içerisine ekleyelim.
protected $routeMiddleware = [
'jwt.verify' => JwtVerify::class,
postman üzerinden deneyerek oturum açmanız sonucunda size bu şekilde bir token dönmüş olucaktır.
bu tokeni oturum gerektiren isteklerinizde postman üzerinden authorization sekmesine giderek type bearer token olarak seçip token alanınıza elde edilen tokeni ekleyerek istek atmalısınız.
0 Yorum
Yorum Bulunmuyor...