Oturum açma (kimlik doğrulama) isteği için hangi yöntemi kullanmalıyım?


93

Bir giriş isteği yaparken hangi http yöntemini kullanmam gerektiğini bilmek istiyorum ve neden? Bu istek sunucuda bir nesne (bir kullanıcı oturumu) oluşturduğuna göre, POST olması gerektiğini düşünüyorum, ne düşünüyorsunuz? Ancak giriş isteğinin idempotent olması gerektiğinden, PUT olabilir, değil mi?

Çıkış isteği için aynı soru, DELETE yöntemini kullanmalı mıyım?

Yanıtlar:


77

Oturum açma talebiniz, bir kullanıcı adı ve şifre sağlayan bir kullanıcı aracılığıyla ise, ayrıntılar URL yerine HTTP mesajları gövdesinde gönderileceği için bir POST tercih edilir. Yine de, https ile şifrelemediğiniz sürece düz metin olarak gönderilecektir.

HTTP DELETE yöntemi, sunucudaki bir şeyi silme isteğidir. Bir bellek içi kullanıcı oturumunu SİLMENİN gerçekten amaçlanan şey olduğunu düşünmüyorum; dahası kullanıcı kaydının kendisini silmek içindir. Dolayısıyla, potansiyel olarak çıkış yalnızca bir GET olabilir, örneğin www.yoursite.com/logout.


1
Giriş isteği ile ilgili olarak, soruma PUT olabileceğini söyleyen bir şey ekledim, GET ile tereddüt etmedim. Ayrıntılı cevap için +1
greg0ire

1
ok - PUT gerçekten sunucuda bir şeyler yaratıyor diye düşünüyorum. Yani DİNLENME anlamında, yeni bir kullanıcı oluştururken kullanabileceğin şey bu sanırım. Ve kullanıcı belirttiğiniz URL'de oluşturulmalıdır. Ancak, bir http oturumu gibi gerçekten geçici olan bir şey için, POST yoluyla oturum açardım.
planetjones

Sanırım, http oturumunun geçici olması, size fikir veriyor. Dediğin gibi yapacağım, teşekkürler.
greg0ire

16
LOGOUT'un GET olması gerektiğine katılmıyorum çünkü sadece "www.siteniz.com/logout" olarak src özniteliğine sahip resim etiketli bir kullanıcı e-postası göndererek bu kullanıcının oturumu kapatılacaktır.
Vytautas Butkus

2
GET pek mantıklı değil.
Bununla

37

LOGIN & LOGOUT yöntemlerini temel CRUD işlemlerine çevirebileceğinize inanıyorum CREATE & DELETE. SESSION adında yeni bir kaynak oluşturduğunuz ve oturumu kapatırken onu yok ettiğiniz için:

  1. POST / oturum açma - oturum oluşturur
  2. DELETE / logout - oturumu yok eder

GET olarak asla LOGOUT yapmam çünkü herhangi biri sadece IMG etiketi içeren bir e-posta göndererek veya böyle bir IMG etiketinin bulunduğu web sitesine bağlantı göndererek saldırı yapabilir. ( <img src="youtsite.com/logout" />)

PS Uzun zamandır RESTful oturum açma / kapatma işlemini nasıl oluşturacağınızı merak ediyordum ve gerçekten basit olduğu ortaya çıktı, aynen anlattığım gibi yaparsınız: CREATE ve DELETE yöntemleriyle / session / endpoint kullanın ve iyisiniz. Oturumu bir şekilde güncellemek istiyorsanız GÜNCELLE'yi de kullanabilirsiniz ...


4
Doğrudan tarayıcı konsolundan bir XHR isteği göndermek gibi, bazıları doğrudan tarayıcıda bulunan modern tarayıcı araçlarıyla bir GET isteği yapmak neredeyse bir GET isteği yapmak kadar kolaydır. Yine de önemli olan anlambilimden ve veritabanından bahsettiğiniz için oy verildi.
trysis

6

İşte REST kılavuzlarına ve önerilerine dayanan çözümüm:

GİRİŞ - bir kaynak oluştur

İstek:

POST => https://example.com/sessions/

BODY => {'login': 'login@example.com', 'password': '123456'}

Tepki:

http status code 201 (Created)

{'token': '761b69db-ace4-49cd-84cb-4550be231e8f'}

LOGOUT - bir kaynağı silin

İstek:

DELETE => https://example.com/sessions/761b69db-ace4-49cd-84cb-4550be231e8f/

Tepki:

http status code 204 (No Content)

2

Oturumu kapatma yöntemiyle ilgili olarak:

İlkbahar (Java Framework) belgelerinde, bir GET sizi CSRF'ye (Siteler Arası İstek Sahteciliği) karşı savunmasız bıraktığı ve kullanıcının oturumu kapatılabileceği için bir POST isteğinin tercih edildiğini belirtirler.

CSRF eklendiğinde LogoutFilter yalnızca HTTP POST kullanacak şekilde güncellenir. Bu, çıkış yapmanın bir CSRF belirteci gerektirmesini ve kötü niyetli bir kullanıcının kullanıcılarınızdan zorla çıkış yapamamasını sağlar.

Bakınız: https://docs.spring.io/spring-security/site/docs/current/reference/html/web-app-security.html#csrf-logout

Oturum açarken de POST kullanılmalıdır (gövde şifrelenebilir, diğer yanıtlara bakın).


0

Giriş isteği için POST yöntemini kullanmalıyız. Çünkü oturum açma verilerimiz güvende ve güvenlik gerektiriyor. POST yöntemi kullanıldığında, veriler bir paket halinde sunucuya gönderilir. Ancak GET yönteminde veriler sunucuya gönderilir ve ardından url, herkesin görebileceği url isteği ile eklenir.

Bu nedenle, güvenli kimlik doğrulama ve yetkilendirme süreci için POST yöntemini kullanmalıyız.

Umarım bu çözüm size yardımcı olur.

Teşekkürler


0

Giriş için POST kullanıyorum, aşağıdaki LOGIN yöntemi kodum Nodejs'i Express ve Mongoose ile kullandım

your router.js
     const express = require("express");
     const router = express.Router();

     router.post("/login", login);

your controller.js
     export.login = async(req, res) => {
         //find the user based on email
         const {email, password} = req.body; 

           try{
                const user =  awaitUser.findOne({email});
                if(user==null) 
                 return res.status(400).json({err : "User with 
                         email doesnot exists.Please signup"});
          }
           catch(error){
                 return res.status(500).json({err : 
                                     error.message});
               }

         //IF EVERYTHING GOES FINE, ASSIGN YOUR TOKEN
          make sure you have JWT installed 
         const token = jwt.sign({_id: user._id}, YOUR_SECRET_KEY);

         res.cookie('t');

         const {_id, name, email} = user;
         return res.json({token, user : {_id, email, name}});



     }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.