मुझे लॉगिन (प्रमाणीकरण) अनुरोध के लिए किस विधि का उपयोग करना चाहिए?


95

मैं यह जानना चाहूंगा कि लॉगिन अनुरोध करते समय मुझे कौन सी http विधि का उपयोग करना चाहिए, और क्यों? चूंकि यह अनुरोध सर्वर पर ऑब्जेक्ट (उपयोगकर्ता सत्र) बनाता है, मुझे लगता है कि यह POST होना चाहिए, आप क्या सोचते हैं? लेकिन चूँकि लॉगिन अनुरोध निष्प्रभावी होना चाहिए, इसलिए यह PUT हो सकता है, नहीं?

लॉगआउट अनुरोध के लिए समान प्रश्न, क्या मुझे DELETE पद्धति का उपयोग करना चाहिए?

जवाबों:


79

यदि आपका लॉगिन अनुरोध उपयोगकर्ता नाम और पासवर्ड की आपूर्ति करने वाले उपयोगकर्ता के माध्यम से है, तो एक POST बेहतर है, क्योंकि विवरण URL के बजाय HTTP संदेश निकाय में भेजे जाएंगे। यद्यपि यह तब भी सादा पाठ भेजा जाएगा, जब तक आप https के माध्यम से एन्क्रिप्ट नहीं कर रहे हैं।

HTTP DELETE विधि सर्वर पर कुछ हटाने का अनुरोध है। मुझे नहीं लगता कि स्मृति उपयोगकर्ता सत्र में DELETING वास्तव में वही है जो इसका उद्देश्य है; अधिक यह उपयोगकर्ता रिकॉर्ड को हटाने के लिए ही है। तो संभावित लॉगआउट सिर्फ एक GET हो सकता है जैसे www.yoursite.com/logout।


1
लॉगिन अनुरोध के बारे में, मैंने अपने प्रश्न में यह कहते हुए कुछ जोड़ा कि यह PUT हो सकता है, मैं GET के साथ संकोच नहीं कर रहा था। विस्तृत जवाब के लिए +1
greg0ire

1
ठीक है - PUT वास्तव में मुझे लगता है कि सर्वर पर कुछ बना रहा है। इसलिए एक ईमानदार अर्थ में, मुझे लगता है कि एक नया उपयोगकर्ता बनाते समय आप क्या उपयोग कर रहे हैं। और उपयोगकर्ता आपके द्वारा निर्दिष्ट URL पर बनाया जाना चाहिए। हालाँकि, कुछ के लिए जो वास्तव में http सत्र की तरह क्षणिक है, तो मैं POST के माध्यम से लॉगिन करूंगा।
ग्रहज

मुझे लगता है कि तथ्य यह है कि http सत्र क्षणिक है आपकी बात बनाता है। जैसा आपने कहा, मैं करने जा रहा हूं, धन्यवाद।
greg0ire

16
मैं इस बात से असहमत हूं कि लॉग-इन GET होना चाहिए क्योंकि बस एक यूजर ईमेल इमेज टैग के साथ भेजकर जिसमें यह src विशेषता है जैसे "www.yoursite.com/logout" उस उपयोगकर्ता को लॉग आउट करेगा।
व्याप्तस बटुक

2
बहुत समझ में नहीं आता है। इस पर एक और इनपुट यहां पाया जा सकता है: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo

40

मेरा मानना ​​है कि आप लॉग इन कर सकते हैं और लॉग इन कर सकते हैं और बुनियादी सीआरयूडी ऑपरेशंस क्रिएट और DELETE में तरीकों का इस्तेमाल कर सकते हैं। चूंकि आप एक नया संसाधन बना रहे हैं जिसे सत्र कहा जाता है और इसे लॉग आउट करते समय नष्ट कर दिया जाता है:

  1. POST / लॉगिन - सत्र बनाता है
  2. DELETE / लॉगआउट - सत्र को नष्ट कर देता है

मैं जीईटी के रूप में कभी भी लॉग इन नहीं करूंगा क्योंकि कोई भी केवल आईएमजी टैग के साथ एक ईमेल भेजकर या वेबसाइट पर लिंक भेजकर हमला कर सकता है जहां इस तरह का आईएमजी टैग मौजूद है। ( <img src="youtsite.com/logout" />)

PS लंबे समय से मैं सोच रहा था कि आप एक RESTful लॉगिन / लॉगआउट कैसे बनायेंगे और यह पता चला कि यह वास्तव में सरल है, आप इसे वैसे ही करते हैं जैसे मैंने वर्णित किया: क्री / डेलिकेट विधियों के साथ उपयोग / सत्र / समापन बिंदु और आप ठीक हैं। यदि आप सत्र को एक या दूसरे तरीके से अपडेट करना चाहते हैं तो आप UPDATE का उपयोग कर सकते हैं ...


4
आधुनिक ब्राउज़र टूल के साथ GET अनुरोध के रूप में DELETE अनुरोध करना लगभग आसान है, जिनमें से कुछ ब्राउज़र में सही उपलब्ध हैं, जैसे ब्राउज़र कंसोल से XHR अनुरोध को सीधे जारी करना। फिर भी उखाड़ा गया क्योंकि आपने शब्दार्थ के बारे में बात की थी, जो महत्वपूर्ण है, साथ ही डेटाबेस भी।
कोशिशें

8

यहाँ मेरा समाधान REST गाइड और सिफारिशों पर आधारित है:

लॉगिन - एक संसाधन बनाएँ

निवेदन:

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

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

उत्तर:

http status code 201 (Created)

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

लॉग इन करें - एक संसाधन हटाएं

निवेदन:

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

उत्तर:

http status code 204 (No Content)

3

लॉग आउट करने की विधि के बारे में:

स्प्रिंग (जावा फ्रेमवर्क) प्रलेखन में, वे कहते हैं कि एक POST अनुरोध को प्राथमिकता दी जाती है, क्योंकि एक GET आपको CSRF (क्रॉस-साइट रिक्वेस्ट फॉरगिरी) के लिए असुरक्षित बनाता है और उपयोगकर्ता को लॉग आउट किया जा सकता है।

CSRF को जोड़ना केवल लॉगआउट HTTP POST का उपयोग करने के लिए LogoutFilter को अपडेट करेगा। यह सुनिश्चित करता है कि लॉग आउट के लिए CSRF टोकन की आवश्यकता होती है और यह दुर्भावनापूर्ण उपयोगकर्ता आपके उपयोगकर्ताओं को जबरन लॉग आउट नहीं कर सकता है।

देखें: https://docs.spring.io/spring-security/site/docs/current/reference/html/web-app-security.html#csrf-logout

लॉग इन करना भी POST का उपयोग करना चाहिए (शरीर एन्क्रिप्ट किया जा सकता है, अन्य उत्तर देखें)।


2

लॉगिन अनुरोध के लिए हमें POST विधि का उपयोग करना चाहिए। क्योंकि हमारा लॉगिन डेटा सुरक्षित है जिसे सुरक्षा की आवश्यकता है। POST विधि का उपयोग करते समय डेटा एक बंडल में सर्वर को भेजा जाता है। लेकिन GET मेथड डेटा को सर्वर द्वारा भेजा जाता है और उसके बाद url जैसे url request के साथ append किया जाता है जो सभी को दिखाई देगा।

तो सुरक्षित प्रमाणीकरण और प्राधिकरण प्रक्रिया के लिए हमें POST विधि का उपयोग करना चाहिए।

मुझे उम्मीद है कि यह समाधान आपकी मदद करेगा।

धन्यवाद


1

लॉगिन के लिए मैं POST का उपयोग करता हूं, नीचे मेरा कोड है LOGIN विधि के लिए मैंने एक्सप्रेस और Mongoose के साथ Nodejs का उपयोग किया

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



     }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.