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

时间:2011-05-03 11:30:46

标签: login logout http-method

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

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

6 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:25)

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

  1. POST / login - 创建会话
  2. DELETE / logout - 销毁会话
  3. 我绝不会因为只是因为任何人只是通过发送带有IMG标签的电子邮件或链接到存在这样的IMG标签的网站而进行攻击而进行攻击。 (<img src="youtsite.com/logout" />

    P.S。 很长一段时间我想知道你将如何创建一个RESTful登录/注销,事实证明它非常简单,就像我描述的那样:使用 / session / 端点和CREATE和DELETE方法,你是精细。如果您想以某种方式更新会话,也可以使用UPDATE ...

答案 2 :(得分:4)

这是我的解决方案,它基于REST指南和建议:

登录 - 创建资源

请求:

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

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

回应:

http status code 201

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

退出 - 删除资源

请求:

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

回应:

http status code 200

答案 3 :(得分: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(正文可以加密,请参见其他答案)。

答案 4 :(得分:0)

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

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

我希望这个解决方案可以帮到你。

由于

答案 5 :(得分:0)

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

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/application_6.xsd"
      version="6">
    <display-name>TutorialGwt</display-name>

    <module>
        <web>
            <web-uri>tutorial_gwtapp.war</web-uri>
            <context-root>/tutorial_gwtapp</context-root>
        </web>
    </module>

    <module>
        <ejb>tutorial_ejb.jar</ejb>
    </module>       

    <!--@includes-->
</application>