ฉันควรใช้วิธีใดในการร้องขอการเข้าสู่ระบบ (การรับรองความถูกต้อง)


93

ฉันต้องการทราบว่าฉันควรใช้วิธีการ http ใดในการร้องขอการเข้าสู่ระบบและเพราะเหตุใด เนื่องจากคำขอนี้สร้างออบเจ็กต์ (เซสชันผู้ใช้) บนเซิร์ฟเวอร์ฉันคิดว่าควรเป็น POST คุณคิดว่าอย่างไร แต่เนื่องจากการร้องขอการเข้าสู่ระบบควรเป็นสิ่งที่ไม่จำเป็นจึงสามารถ PUT ได้หรือไม่?

คำถามเดียวกันสำหรับคำขอออกจากระบบฉันควรใช้เมธอด DELETE หรือไม่

คำตอบ:


77

หากคำขอเข้าสู่ระบบของคุณผ่านทางผู้ใช้ที่ระบุชื่อผู้ใช้และรหัสผ่านควรใช้ POST เนื่องจากรายละเอียดจะถูกส่งไปในเนื้อหาข้อความ HTTP แทนที่จะเป็น URL แม้ว่าจะยังคงส่งข้อความธรรมดาเว้นแต่คุณจะเข้ารหัสผ่าน https

เมธอด HTTP DELETE คือการร้องขอให้ลบบางสิ่งบนเซิร์ฟเวอร์ ฉันไม่คิดว่าการลบเซสชันผู้ใช้ในหน่วยความจำเป็นสิ่งที่ตั้งใจไว้จริงๆ ยิ่งไปกว่านั้นสำหรับการลบบันทึกผู้ใช้เอง ดังนั้นการออกจากระบบอาจเป็นเพียง GET เช่น www.yoursite.com/logout


1
เกี่ยวกับคำขอเข้าสู่ระบบฉันได้เพิ่มบางสิ่งในคำถามของฉันโดยบอกว่าอาจเป็น PUT ฉันไม่ลังเลกับ GET +1 สำหรับคำตอบโดยละเอียด
greg0ire

1
ตกลง - PUT กำลังสร้างบางสิ่งบนเซิร์ฟเวอร์ที่ฉันคิด ในแง่ดีฉันเดาว่านั่นคือสิ่งที่คุณควรใช้หากสร้างผู้ใช้ใหม่ และควรสร้างผู้ใช้ที่ URL ที่คุณระบุ อย่างไรก็ตามสำหรับบางสิ่งที่ชั่วคราวเช่นเซสชัน http ฉันจะเข้าสู่ระบบผ่าน POST
planetjones

ฉันคิดว่าความจริงที่ว่าเซสชัน http เป็นแบบชั่วคราวทำให้ประเด็นของคุณ ฉันจะทำตามที่คุณบอกขอบคุณ
greg0ire

16
ฉันไม่เห็นด้วยที่ LOGOUT ควรเป็น GET เพราะเพียงแค่ส่งอีเมลผู้ใช้พร้อมแท็กรูปภาพที่มีแอตทริบิวต์ src เป็น "www.yoursite.com/logout" ก็จะทำให้ผู้ใช้รายนั้นออกจากระบบ
Vytautas Butkus

2
GET ไม่สมเหตุสมผลเท่าไหร่ ข้อมูลอื่น ๆ เกี่ยวกับสิ่งนี้สามารถพบได้ที่นี่: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo

37

ฉันเชื่อว่าคุณสามารถแปลวิธีการ LOGIN & LOGOUT เป็นการดำเนินการ CRUD ขั้นพื้นฐานได้ CREATE & DELETE เนื่องจากคุณกำลังสร้างทรัพยากรใหม่ชื่อ SESSION และทำลายทิ้งเมื่อออกจากระบบ:

  1. POST / login - สร้างเซสชัน
  2. DELETE / logout - ทำลายเซสชัน

ฉันจะไม่ทำ LOGOUT เป็น GET เพียงเพราะใครก็ตามสามารถโจมตีได้เพียงแค่ส่งอีเมลพร้อมแท็ก IMG หรือลิงก์ไปยังเว็บไซต์ที่มีแท็ก IMG อยู่ ( <img src="youtsite.com/logout" />)

ป.ล. ฉันสงสัยมานานแล้วว่าคุณจะสร้างการเข้าสู่ระบบ / ออกจากระบบ RESTful ได้อย่างไรและปรากฎว่ามันง่ายจริงๆคุณทำเหมือนที่ฉันอธิบายไว้: use / session / endpoint ด้วยวิธีการสร้างและลบและคุณก็สบายดี นอกจากนี้คุณยังสามารถใช้ UPDATE ได้หากต้องการอัปเดตเซสชันไม่ทางใดก็ทางหนึ่ง ...


4
เกือบจะเป็นเรื่องง่ายที่จะทำคำขอ DELETE เหมือนกับคำขอ GET ด้วยเครื่องมือเบราว์เซอร์ที่ทันสมัยซึ่งบางส่วนมีอยู่ในเบราว์เซอร์เช่นการออกคำขอ XHR โดยตรงจากคอนโซลเบราว์เซอร์ ยังคงได้รับการโหวตเนื่องจากคุณพูดถึงความหมายซึ่งมีความสำคัญเช่นเดียวกับฐานข้อมูล
trysis

6

นี่คือวิธีแก้ปัญหาของฉันตามคำแนะนำและคำแนะนำ REST:

เข้าสู่ระบบ - สร้างทรัพยากร

คำขอ:

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

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

การตอบสนอง:

http status code 201 (Created)

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

LOGOUT - ลบทรัพยากร

คำขอ:

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

การตอบสนอง:

http status code 204 (No Content)

2

เกี่ยวกับวิธีการออกจากระบบ:

ในเอกสาร Spring (Java Framework) พวกเขาระบุว่าคำขอ POST เป็นที่ต้องการเนื่องจาก GET ทำให้คุณเสี่ยงต่อ CSRF (การปลอมแปลงคำขอข้ามไซต์) และผู้ใช้อาจออกจากระบบได้

การเพิ่ม CSRF จะอัปเดต LogoutFilter ให้ใช้ HTTP POST เท่านั้น เพื่อให้แน่ใจว่าการออกจากระบบต้องใช้โทเค็น CSRF และผู้ใช้ที่ประสงค์ร้ายไม่สามารถบังคับให้ผู้ใช้ของคุณออกจากระบบได้

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

การเข้าสู่ระบบควรใช้ POST (สามารถเข้ารหัสเนื้อหาได้ดูคำตอบอื่น ๆ )


0

สำหรับคำขอเข้าสู่ระบบเราควรใช้วิธีการโพสต์ เนื่องจากข้อมูลการเข้าสู่ระบบของเรามีความปลอดภัยซึ่งต้องการความปลอดภัย เมื่อใช้วิธี POST ข้อมูลจะถูกส่งไปยังเซิร์ฟเวอร์ในกลุ่ม แต่ในวิธี GET ข้อมูลจะถูกส่งไปยังเซิร์ฟเวอร์ตามด้วย url เช่นต่อท้ายด้วยคำขอ url ซึ่งทุกคนจะเห็น

ดังนั้นสำหรับกระบวนการตรวจสอบและการอนุญาตที่ปลอดภัยเราควรใช้วิธีการ POST

ฉันหวังว่าโซลูชันนี้จะช่วยคุณได้

ขอบคุณ


0

สำหรับการเข้าสู่ระบบฉันใช้ POST ด้านล่างนี้คือรหัสของฉันสำหรับวิธีการ LOGIN ฉันใช้ Nodejs กับ Express และ 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}});



     }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.