理解django rest框架中的会话身份验证?

理解django rest框架中的会话身份验证?,django,authentication,django-rest-framework,Django,Authentication,Django Rest Framework,我使用的是Django v1.8和Django rest框架v3.2.2。我有一个带有面向公众的API的站点,我自己的站点(在同一个域上)也使用它作为JavaScript应用程序的Ajax后端,只使用GET 我希望此API的公共用户被要求在URL中输入一个key参数,我将手动发布该参数。但我也希望我的JavaScript应用程序能够使用API,这意味着其他用户不能窃取密钥并使用它 我已经设置了自定义密钥身份验证,它运行良好 但是,我不清楚JavaScript应用程序应该如何使用API。显然,我可

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

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

我已经设置了自定义密钥身份验证,它运行良好

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

我想我需要SessionAuthentication,但我怎么才能开始工作呢?我看不到关于如何更改JavaScript调用以使用它的任何说明

另外,我不明白SessionAuthentication如何允许Ajax应用程序进行身份验证,而其他用户无法查看和复制身份验证

非常感谢你的建议

我想我需要SessionAuthentication,但我怎么才能开始工作呢?我在DRF文档中看不到关于如何更改JavaScript调用以使用它的任何说明

SessionAuthentication是Django的验证。它使用会话对用户进行身份验证。对于ajax请求,它基本上是透明的,因为浏览器将自动发送cookie。但是,如果您正在发布数据,则需要确保在头和发布正文中都发送CSRF令牌

另外,我不明白SessionAuthentication如何允许Ajax应用程序进行身份验证,而其他用户无法查看和复制身份验证

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

通常情况下,您在授权标头中传递密钥/auth令牌,而不是在url中传递。会话身份验证在使用默认django登录时使用,然后还将对您进行身份验证以访问api,您需要将会话身份验证添加到rest framework设置中。您可以使用会话身份验证或令牌身份验证,也可以同时使用这两种身份验证。然而,正如@PieterHamman所提到的,用户需要进行身份验证才能使用API。身份验证后,用户需要在每个请求头中传递会话id/令牌。有关会话与令牌身份验证之间的比较,请参阅:您还可以查看django rest framework jwt,它是一个用于drf的包,实现了jwt并具有内置身份验证。谢谢。但我如何确保只有我的应用程序才允许使用SessionAuthentication,而没有其他人的?如果它们在同一个域上,它会自动工作吗?(我只使用GET请求。)不太清楚您试图用身份验证做什么,特别是为什么他们需要那个密钥参数。至于你的站点,为什么不为你的站点设置一个特殊的令牌身份验证呢?谢谢@Linovia。重新身份验证—我希望用户在使用API之前必须请求密钥,以便我知道他们是谁,并且在他们开始敲打API时可以控制访问。你是我的站点吗?那么我会为我的站点创建一个令牌,并将其包含在Ajax API使用的JS头中?那么令牌在源JS中不可见吗?