109

我想知道在进行登录请求时应该使用哪种http方法,为什么?既然这个请求在服务器上创建了一个对象(一个用户会话),我觉得应该是POST,你觉得呢?但是由于登录请求应该是幂等的,所以它可以是 PUT,不是吗?

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

4

6 回答 6

90

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

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

于 2011-05-03T11:36:17.167 回答
45

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

  1. POST /login - 创建会话
  2. DELETE /logout - 销毁会话

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

PS 很长一段时间我想知道你将如何创建一个 RESTful 登录/注销,结果它真的很简单,你就像我描述的那样做:使用/session/端点与 CREATE 和 DELETE 方法,你很好。如果您想以一种或另一种方式更新会话,也可以使用 UPDATE...

于 2014-02-21T11:34:17.650 回答
12

这是我基于 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)
于 2018-06-10T09:47:35.087 回答
10

对于登录请求,我们应该使用 POST 方法。因为我们的登录数据是安全的,需要安全性。使用 POST 方法时,数据以捆绑的形式发送到服务器。但是在 GET 方法中,数据被发送到服务器,然后是 url,例如 append with url request,每个人都可以看到。

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

我希望这个解决方案能帮助你。

谢谢

于 2018-02-22T08:23:31.133 回答
6

关于退出的方法:

在 Spring(Java 框架)文档中,他们声明首选 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(正文可以加密,请参阅其他答案)。

于 2019-02-05T08:42:25.703 回答
0

对于登录,我使用 POST,下面是我使用 Nodejs 和 Express 和 Mongoose 的 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}});



     }
于 2020-02-12T20:14:16.407 回答