OAuth2授权端点上需要CSRF令牌

时间:2014-12-23 15:26:29

标签: django oauth

我正在使用django-oauth-toolkit将OAuth2 Implicit Grant type集成到我的项目中。

当我尝试访问授权端点(通常为http://localhost:8000/o/authorize/)时,我收到403 FORBIDDEN状态,Django要求提供CSRF令牌。

为了对这篇文章留下一些意见,我很高兴知道我正在开发一个跨域应用程序,其中前端是用Javascript实现的,我不想在不同的域中设置CORS和cookie(所以不,csrftoken cookie 不可用),这就是为什么我要使用OAuth和可选的state信息来充当csrftoken看起来很像。

作为排除故障的其他帮助,我能够使用official Django documentation中提到的http://localhost:8000/o/authorize/ Cookie从同一个域获取csrftoken的请求。因此,看起来授权服务器在某种程度上受Django CSRF保护。这是我应该期待的吗?我认为OAuth2(和间接django-oauth-toolkit)将允许跨域客户端进行身份验证,而无需csrf令牌。我错过了什么?

最后,我不确定我设置中间件的顺序是否可以解释这种行为,但这是我当前的设置:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware'
)

我应该在OAuth2TokenMiddleware之前放置CsrfViewMiddleware还是类似的东西?

1 个答案:

答案 0 :(得分:1)

授权过程以该URL的GET开头,呈现一个表单,其中包含授权过程创建GRANT标记所需的信息。

默认授权表单有一个csrf_token作为字段,这应该是POST数据的一部分,如果你不想在请求中设置csrf,你应该继承oauth2_provider.views.base.AuthorizationView并标记它为csrf_exempt,在包含其他oauth工具包之前放置该URL。