Metode apa yang harus saya gunakan untuk permintaan masuk (otentikasi)?

93

Saya ingin tahu metode http mana yang harus saya gunakan saat melakukan permintaan masuk, dan mengapa? Karena permintaan ini membuat objek (sesi pengguna) di server, saya pikir itu harus POST, bagaimana menurut Anda? Tapi karena permintaan login harus idempoten, bisa jadi PUT, bukan?

Pertanyaan yang sama untuk permintaan logout, haruskah saya menggunakan metode DELETE?

greg0ire
sumber

Jawaban:

77

Jika permintaan login Anda adalah melalui pengguna yang memberikan nama pengguna dan kata sandi, maka POST lebih disukai, karena detailnya akan dikirim dalam badan pesan HTTP daripada di URL. Meskipun masih akan dikirim teks biasa, kecuali Anda mengenkripsi melalui https.

Metode HTTP DELETE adalah permintaan untuk menghapus sesuatu di server. Saya tidak berpikir bahwa MENGHAPUS sesi pengguna dalam memori benar-benar dimaksudkan; lebih untuk menghapus rekaman pengguna itu sendiri. Jadi berpotensi logout bisa jadi hanya GET misalnya www.yoursite.com/logout.

planetjones
sumber
1
Mengenai permintaan masuk, saya menambahkan sesuatu ke pertanyaan saya yang mengatakan itu bisa jadi PUT, saya tidak ragu-ragu dengan GET. 1 untuk jawaban terperinci
greg0ire
1
ok - PUT benar-benar membuat sesuatu di server saya pikir. Jadi dalam arti yang tenang saya rasa itulah yang BISA Anda gunakan jika membuat pengguna baru. Dan pengguna harus dibuat di URL yang Anda tentukan. Namun, untuk sesuatu yang benar-benar sementara seperti sesi http, maka saya akan login melalui POST.
planetjones
Saya pikir fakta bahwa sesi http bersifat sementara membuat Anda mengerti maksud Anda. Saya akan melakukan apa yang Anda katakan, terima kasih.
greg0ire
16
Saya tidak setuju bahwa LOGOUT harus DAPATKAN karena hanya dengan mengirimkan email pengguna dengan tag gambar yang memiliki atribut src sebagai "www.situsanda.com/logout" akan mengeluarkan pengguna tersebut.
Vytautas Butkus
2
GET tidak masuk akal. Masukan lain tentang ini dapat ditemukan di sini: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo
37

Saya yakin Anda dapat menerjemahkan metode LOGIN & LOGOUT ke dalam operasi CRUD dasar CREATE & DELETE. Karena Anda membuat sumber daya baru yang disebut SESI dan menghancurkannya saat keluar:

  1. POST / login - membuat sesi
  2. HAPUS / keluar - hancurkan sesi

Saya tidak akan pernah melakukan LOGOUT sebagai GET hanya karena siapa pun dapat melakukan serangan hanya dengan mengirimkan email dengan tag IMG atau tautan ke situs web di mana tag IMG tersebut ada. ( <img src="youtsite.com/logout" />)

PS Lama saya bertanya-tanya bagaimana Anda membuat login / logout RESTful dan ternyata itu sangat sederhana, Anda melakukannya seperti yang saya jelaskan: gunakan / sesi / endpoint dengan metode CREATE dan DELETE dan Anda baik-baik saja. Anda juga dapat menggunakan UPDATE jika Anda ingin memperbarui sesi dengan satu atau lain cara ...

Vytautas Butkus
sumber
4
Melakukan permintaan DELETE hampir semudah permintaan GET dengan alat browser modern, beberapa di antaranya tersedia langsung di browser, seperti mengeluarkan permintaan XHR langsung dari konsol browser. Masih mendapat suara positif karena Anda berbicara tentang semantik, yang juga penting, serta database.
trisis
6

Inilah solusi saya berdasarkan panduan dan rekomendasi REST:

LOGIN - buat sumber daya

Permintaan:

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

BODY => {'login': '[email protected]', 'password': '123456'}

Tanggapan:

http status code 201 (Created)

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

LOGOUT - hapus sumber daya

Permintaan:

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

Tanggapan:

http status code 204 (No Content)
Ali Mamedov
sumber
2

Mengenai metode untuk keluar:

Dalam dokumentasi Spring (Java Framework), mereka menyatakan bahwa permintaan POST lebih disukai, karena GET membuat Anda rentan terhadap CSRF (Cross-Site Request Forgery) dan pengguna dapat dikeluarkan.

Menambahkan CSRF akan memperbarui LogoutFilter agar hanya menggunakan HTTP POST. Ini memastikan bahwa logout memerlukan token CSRF dan bahwa pengguna jahat tidak dapat secara paksa mengeluarkan pengguna Anda.

Lihat: https://docs.spring.io/spring-security/site/docs/current/reference/html/web-app-security.html#csrf-logout

Masuk juga harus menggunakan POST (badan dapat dienkripsi, lihat jawaban lain).

DrunkenPope
sumber
0

Untuk permintaan login kita harus menggunakan metode POST. Karena data login kita aman yang membutuhkan keamanan. Saat menggunakan metode POST, data dikirim ke server dalam bentuk bundel. Tetapi dalam metode GET data dikirim ke server diikuti oleh url seperti menambahkan dengan permintaan url yang akan terlihat oleh semua orang.

Jadi Untuk proses otentikasi dan otorisasi yang aman kita harus menggunakan metode POST.

Saya harap solusi ini akan membantu Anda.

Terima kasih

Aman Goyal
sumber
0

Untuk Login saya menggunakan POST, di bawah ini adalah kode saya untuk metode LOGIN saya menggunakan Nodejs dengan Express dan Mongoose

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}});



     }
xSachinx
sumber