登录(身份验证)请求应该使用什么方法?

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

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

126341 次浏览

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

HTTPDELETE 方法是在服务器上删除某些内容的请求。我不认为删除内存中的用户会话是它真正的目的; 更多的是为了删除用户记录本身。所以注销可能只是一个 GET 例如 www.yoursite.com/logout。

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

  1. POST/login-create session
  2. 删除/注销-销毁会话

我永远不会做登录获取只是因为任何人都可以进行攻击,只是发送一封带有 IMG 标签的电子邮件或链接到存在这样一个 IMG 标签的网站。(<img src="youtsite.com/logout" />)

附言。 我一直想知道如何创建一个 RESTful 登录/注销,结果非常简单,就像我描述的那样: 使用带有 CREATE 和 DELETE 方法的 /会议/端点就可以了。如果您想以某种方式更新会话,也可以使用 UPDATE..。

对于登录请求,我们应该使用 POST 方法。因为我们的登录数据是安全的,需要安全。使用 POST 方法时,数据以捆绑包的形式发送到服务器。但是在 GET 方法中,数据被发送到服务器,后面跟着带有 url 请求的 url 附加,这样每个人都可以看到。

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

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

谢谢

以下是我基于 REST 指南和建议的解决方案:

LOGIN -创建一个资源

要求:

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)

关于注销的方法:

在 Spring (Java Framework)文档中,他们声明首选 POST 请求,因为 GET 使您容易受到 CSRF (跨站请求伪造)的攻击,用户可能会被注销。

添加 CSRF 将更新 LogoutFilter 以仅使用 HTTPPOST。这样可以确保注销需要 CSRF 令牌,并且恶意用户不能强制注销用户。

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

登录还应该使用 POST (主体可以加密,请参阅其他答案)。

对于 LOGIN 我使用 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}});






}