我正在使用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
还是类似的东西?
答案 0 :(得分:1)
授权过程以该URL的GET开头,呈现一个表单,其中包含授权过程创建GRANT标记所需的信息。
默认授权表单有一个csrf_token作为字段,这应该是POST数据的一部分,如果你不想在请求中设置csrf,你应该继承oauth2_provider.views.base.AuthorizationView
并标记它为csrf_exempt
,在包含其他oauth工具包之前放置该URL。