登录(身份验证)请求应使用哪种方法?


93

我想知道在执行登录请求时应该使用哪种http方法,为什么?由于此请求在服务器上创建了一个对象(用户会话),因此我认为应该是POST,您如何看待?但是由于登录请求应该是幂等的,所以可以是PUT,不是吗?

有关注销请求的相同问题,我应该使用DELETE方法吗?

Answers:


77

如果您的登录请求是通过提供用户名和密码的用户进行的,则最好使用POST,因为详细信息将在HTTP消息正文而不是URL中发送。尽管仍然会发送纯文本,除非您通过https加密。

HTTP DELETE方法是在服务器上删除某些内容的请求。我不认为删除内存中的用户会话确实是想要的。更多用于删除用户记录本身。因此,可能的注销可能只是一个GET,例如www.yoursite.com/logout。


1
关于登录请求,我在问题中添加了一些内容,说可能是PUT,我毫不犹豫地使用GET。+1以获得详细答案
greg0ire,2011年

1
好的-我认为PUT确实在服务器上创建了东西。因此,从REST的角度来说,我猜这就是您创建新用户时应该使用的。并且应该在您指定的URL上创建用户。但是,对于诸如HTTP会话之类的真正短暂的事件,那么我将通过POST登录。
planetjones

我认为http会话是瞬态的事实说明了您的观点。我要照你说的去做,谢谢。
greg0ire

16
我不同意LOGOUT应该是GET,因为仅通过发送带有src属性为“ www.yoursite.com/logout”的带有图像标签的用户电子邮件将注销该用户。
Vytautas Butkus 2014年

2
GET没有多大意义。关于此的另一个输入可以在这里找到:stackoverflow.com/questions/3521290/logout-get-or-post
thasmo 2015年

37

我相信您可以将LOGIN&LOGOUT方法转换为基本的CRUD操作CREATE&DELETE。由于您要创建一个名为SESSION的新资源并在注销时销毁它:

  1. POST /登录-创建会话
  2. 删除/注销-破坏会话

我绝不会以GET身份登出,因为任何人都可以仅仅通过发送带有IMG标签的电子邮件或链接到存在IMG标签的网站来进行攻击。(<img src="youtsite.com/logout" />

PS很久以来,我一直在想如何创建RESTful登录/注销,事实证明这很简单,您就像我描述的那样进行操作:将/ session /端点与CREATE和DELETE方法一起使用就可以了。如果您想以一种或另一种方式更新会话,也可以使用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'}

注销-删除资源

请求:

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方法。因为我们的登录数据是安全的,所以需要安全性。使用POST方法时,数据将成捆发送到服务器。但是在GET方法中,数据将被发送到服务器,然后是url,例如带有url request的追加,这将被所有人看到。

因此,对于安全的身份验证和授权过程,我们应该使用POST方法。

希望此解决方案对您有所帮助。

谢谢


0

对于登录,我使用POST,以下是我对Express和Mongoose使用Nodejs的LOGIN方法的代码

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



     }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.