Rest Oturum Yönetimi
-
Rest api' lerde oturum yönetimi nasıl oluyor ?
Login için bir tane '/userlogin' diye birşey var. Veritabanında da api key adında bir parametre tutuyor, user login olduktan sonra api key bilgisini user' a json olarak gönderiyor.
sonra herhangi bir get isteğinde bu api key' i HEADER' a ekleyip gönderiyor ve ordan veritabanındakiyle kontrol ediyor. eğer yoksa authorization vermiyor.
şimdi normalde SESSION' lar ile yapıyorduk ama burda restful stateless. Client' a login olduktan sonra verdiği api key' i nerde saklayabilirim ?
Bir de nasıl logout ettirebilirim -heralde o sakladığım api key' i kaldırmam yetecek. Ama nerede tutacağımı bilmiyorum.
Kullanıcı LOGOUT olana kadar bu api_key ile işlemlerini görücem, o yüzden client side da güvenli şekilde tutmam gerekiyor.
Bu arada örnek olsun diye kod parçalarını koyuyorum :
-- Rest api LOGIN
$app->post('/userlogin', function() use ($app) { verifyRequiredParams(array('email', 'password')); $email = $app->request->post('email'); $password = $app->request->post('password'); $objUserRegLog = new UserRegistrationLogin; $result = $objUserRegLog->getUserByEmailAndPassword($email, $password); if (!$result) { $response["error"] = true; $response["message"] = "E-Posta ya da şifreniz hatalı!"; } else { $response["error"] = false; $response["id"] = $result["id"]; $response["email"] = $result["email"]; $response["api_key"] = $result["api_key"]; } echoResponse(200, $response); });-- Sign In AJAX CALL :
$.signin = function() { var inputVals = $("#form_signin").serialize(); $.ajax({ url : "api/v1/userlogin", data : inputVals, dataType : "json", type : "post", success : function(response) { if (response.error) { $(".popup").trigger("click"); $(".modal-title").html(response.message_title); $(".modal-body").html(response.message); } else { // RESPONSE DEĞERLERİ BURADA ? window.location.href = "index.php"; } console.log(response); } }); return false; }-- Bu da API KEY KONTROLÜ ve GET
$app->get('/cases', 'authenticatePathologist', function() use ($app) { $objCases = new Cases; $result = $objCases->getAllCases(); if (!$result) { $response["error"] = true; $response["error_msg"] = "Bir sorun oluştu."; $status_code = 404; } else { $response["error"] = false; $response["cases"] = $result; $status_code = 200; } echoResponse($status_code, $response); });function authenticatePathologist(\Slim\Route $route) { $headers = apache_request_headers(); $response = array(); $app = \Slim\Slim::getInstance(); if (isset($headers['Authorization'])) { $db = new DbOperation(); $api_key = $headers['Authorization']; if (!$db->isValidPathologist($api_key)) { $response["error"] = true; $response["message"] = "Access Denied. Invalid Api key"; echoResponse(401, $response); $app->stop(); } } else { $response["error"] = true; $response["message"] = "Api key is misssing"; echoResponse(400, $response); $app->stop(); } }ozgunlu tarafından 21/Nis/16 15:21 tarihinde düzenlenmiştir -
Localstorage de tutabilirsin. Çıkışta temizler tokenı db den silersin
-
fikir vermesi açısından : http://www.tahribat.com/forum/php-rest-api-guvenligi-nasil-saglanir--217724
-
Cosmic bunu yazdı
Localstorage de tutabilirsin. Çıkışta temizler tokenı db den silersin
Evet bu işimi gördü hocam sağol.
3-4 saattir okuyorum da kafam allak bullak oldu.
Şu konuda birileri aydınlatsa fena olmayacak.
OAuth, OAuth2, HttpBasicAuthentication, JWT gibi terimler var. Benim kullandığım hangisine giriyor, onu da bilmemekle beraber hangisi iyidir, hangisi kötüdür ?
Sonuç olarak, HTTPS ile haberleşince user gidip api_key' ini başkalarıyla share etmezse bi sıkıntı çıkmayacak dimi ?
@Genki sağol hocam, bakıyorum ona da.
ozgunlu tarafından 21/Nis/16 16:10 tarihinde düzenlenmiştir -
JWT kullanmayı öğrenmek lazım. Session yok, bu yüzden depolamaya da gerek yok (tmp klasörü içinde io işlemi yapılmayacak). Sadece secret-key'in güvenliğini sağlamak yeterli.
