【问题标题】:Understanding SessionAuthentication in django-rest-framework?了解 django-rest-framework 中的 SessionAuthentication?
【发布时间】:2015-11-11 05:18:53
【问题描述】:

我正在使用 Django v1.8 和 django-rest-framework v3.2.2。我有一个带有面向公众的 API 的站点,它也被我自己的站点(在同一域上)作为 JavaScript 应用程序的 Ajax 后端使用,仅使用 GET。

我希望此 API 的公共用户被要求在 URL 中输入 key 参数,我将手动发出该参数。但我也希望我的 JavaScript 应用程序能够使用 API,这意味着其他用户不能只是窃取密钥并使用它。

我已经设置了我的自定义密钥身份验证as described here,并且运行良好。

但是,我不清楚 JavaScript 应用程序应该如何使用 API。显然我可以在 URL 中传递一个专用的 key 参数,但是其他用户就不能轻易地发现密钥并使用它吗?

我认为我需要 SessionAuthentication,但我什至如何开始进行这项工作?我看不到任何关于如何更改我的 JavaScript 调用以使用它的说明 in the DRF documentation

我也不明白 SessionAuthentication 如何允许 Ajax 应用程序在其他用户无法查看和复制身份验证的情况下进行身份验证。

非常感谢您的任何建议。

【问题讨论】:

  • 通常您在授权标头中而不是在 url 中传递密钥/身份验证令牌。使用默认 django 登录时使用会话身份验证,然后您也将被身份验证以访问 api,您需要将会话身份验证添加到 rest 框架设置。
  • 您可以使用会话身份验证或令牌身份验证,或同时使用两者。但是,正如@PieterHamman 所提到的,用户需要进行身份验证才能使用 API。认证后,用户需要在每个请求头中传递 session_id/token。有关会话与令牌身份验证之间的比较,请参阅:security.stackexchange.com/questions/81756/… 您还可以查看 django-rest-framework-jwt,它是用于实现 JWT 并具有内置身份验证的 drf 包。

标签: django authentication django-rest-framework


【解决方案1】:

我认为我需要 SessionAuthentication,但我什至如何开始进行这项工作?我在 DRF 文档中看不到任何关于如何更改我的 JavaScript 调用以使用它的说明。

SessionAuthentication 是 Django 的。它使用会话来验证用户。由于浏览器会自动发送 cookie,因此对于 ajax 请求来说它几乎是透明的。但是,如果您要发布数据,则需要确保在标头和帖子正文中都发送 CSRF 令牌。

我也不明白 SessionAuthentication 如何允许 Ajax 应用程序在其他用户无法查看和复制身份验证的情况下进行身份验证。

如上所述,它为此使用 cookie。它们是标题的一部分,因此通常不会出现在 url 上。 为了确保没有其他人可以窃取用户的会话,您需要通过 https 运行该站点。 这与普通网站没有太大区别。

【讨论】:

  • 谢谢。但是我如何确保只有 my 应用程序被允许使用 SessionAuthentication,而没有其他人的?如果他们在同一个域上,它会自动工作吗? (我只使用 GET 请求。)
  • 目前还不清楚您要对身份验证做什么,特别是为什么他们需要那个关键参数。至于你的站点,为什么不只为你的站点设置一个特殊的令牌认证呢?
  • 谢谢@Linovia。重新身份验证 - 我希望用户在使用 API 之前必须请求密钥,以便我知道他们是谁,并且可以在他们开始敲击 API 时控制访问。重新我的网站 - 所以我会为我的网站创建一个令牌,并将其包含在 Ajax API 使用的 JS 标头中?令牌不会在源 JS 中可见吗?
猜你喜欢
  • 2013-10-12
  • 2016-02-28
  • 2020-01-25
  • 1970-01-01
  • 2023-04-07
  • 2013-02-16
  • 2019-07-13
  • 2015-05-21
  • 2019-10-04
相关资源
最近更新 更多