【问题标题】:How to authenticate an http request that isn't POST?如何验证不是 POST 的 http 请求?
【发布时间】:2013-08-18 04:40:53
【问题描述】:

我正在创建一个RESTful api,但从概念上讲我不明白如何验证不是 POST 的 http 请求。

例如,如果我收到一个 GET 请求,我应该返回一个对象列表,但如果该请求来自在我网站上注册的人,我只想用该列表进行响应。使用 POST,我将获取用户名并与请求一起传递,但 GET、DELETE 和 PUT 呢?

我在客户端使用 Django 服务器端和 Java (Android)。我可能会使用TastyPie,但我仍然需要进行身份验证。

谢谢!

【问题讨论】:

    标签: http rest authentication


    【解决方案1】:

    当用户首次登录时发出 POST 请求,并在服务器上为该用户生成会话代码并将其发送到浏览器。现在,您可以在每次查询时将会话代码放入您的 GET 查询 url,从而从浏览器发送该会话代码,这样您就可以在服务器上对用户进行身份验证。

    【讨论】:

    • 或者使用cookies。但无论哪种方式,任何可以看到 HTTP 数据的网络嗅探器都可以公开访问会话代码,因此请确保对发送该会话代码的任何 URL 使用 HTTPS。但即便如此,您仍然需要注意通过 HTTPS 感知代理/调试器(如 Fiddler)进行的 MITM 攻击。
    • 感谢您的回答。我熟悉 Django 的登录和会话功能,但在我的应用程序中,客户端不是 Web 浏览器;它是 Android 设备上的自定义应用程序。
    【解决方案2】:

    POST 仅在您的服务器通过application/x-www-form-urlencodedmultipart/form-data 编码的HTTP 请求使用基于表单的身份验证时才需要,而不是通过HTTP Authorization 标头使用基于HTTP 的身份验证。 GET 请求可以使用基于 HTTP 的身份验证。

    【讨论】:

      【解决方案3】:

      API 调用的身份验证与您使用的 HTTP 方法无关。

      以这种方式考虑您的 API 的功能性工作流程:

      1. 在发送常规 API 调用之前,发送调用登录/生成 API 登录密钥
      2. 收到 API 调用后,立即运行身份验证检查功能,以验证是否允许他们使用该调用。
      3. 如果通过了身份验证,请继续。如果未通过身份验证,则会出现一些错误代码和消息。
      4. 如果继续,执行正常功能并完成。

      【讨论】:

        【解决方案4】:

        授权由(恰当命名的)HTTP 授权标头处理。

        Authorization 标头包含凭据/令牌/秘密代码/等,无论如何获得,服务器都可以使用它们来满足其身份验证和授权要求。

        授权头可以与任何 HTTP 请求一起发送。

        请随意查找 HTTP BASIC 或 HTTP DIGEST 身份验证作为如何使用 Authorization 标头的示例。还可以考虑查看 Amazon Web Services 如何使用 Authorization 标头以获得更复杂的示例。

        【讨论】:

        • 谢谢你,威尔。我看了一点,发现这些概念都被 Tastypie 框架封装了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        相关资源
        最近更新 更多