我正在使用我的Django v1.5.3应用程序中为Dropbox API v1.6描述的DropboxOAuth2Flow方法,并且在重定向到dropbox oauth2授权页面时遇到400错误。
当我转到我的dropbox_auth_start网址时,我被重定向到:
然后发生400错误。
顺便说一句,“dropbox-auth-csrf-token”会写在会话文件中。
我的django代码:
views.py
def get_dropbox_auth_flow(web_app_session):
redirect_uri = "http://www.mydomain.com"
return DropboxOAuth2Flow('blahblahblah', 'blehblehbleh', redirect_uri, web_app_session, "dropbox-auth-csrf-token")
# URL handler for /dropbox-auth-start
def dropbox_auth_start(request):
authorize_url = get_dropbox_auth_flow(request.session).start()
return HttpResponseRedirect(authorize_url)
# URL handler for /dropbox-auth-finish
def dropbox_auth_finish(request):
try:
access_token, user_id, url_state = get_dropbox_auth_flow(request.session).finish(request.GET)
except DropboxOAuth2Flow.BadRequestException, e:
http_status(400)
except DropboxOAuth2Flow.BadStateException, e:
# Start the auth flow again.
return HttpResponseRedirect("http://www.mydomain.com/dropbox_auth_start")
except DropboxOAuth2Flow.CsrfException, e:
return HttpResponseForbidden()
except DropboxOAuth2Flow.NotApprovedException, e:
raise e
except DropboxOAuth2Flow.ProviderException, e:
raise e
urls.py
from django.conf.urls import patterns, url, include
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^dropbox_auth_start/?$',views.dropbox_auth_start),
url(r'^dropbox_auth_finish/?$',views.dropbox_auth_finish),
)
答案 0 :(得分:2)
就像@smarx所说,我刚刚从HTTP和HTTPS切换,一切正常。
答案 1 :(得分:2)
我最近遇到了这个问题,我的网站链接始终使用https链接。我不确定我的解决方案是完全有效还是安全,但目前它会阻止导致我的服务出现大量不良注册问题的错误。
因为在某些情况下,当用户被重定向到dropbox并且返回时,Django会话层似乎不起作用,似乎CSRF令牌作为回调响应中的“state”参数传递回您的应用程序。我的解决方案是在您的视图处理程序中检查身份验证,检查csrf会话密钥是否存在,以及是否从参数“state”获取它并在调用dropbox请求身份验证流程之前将其添加到会话中。
try:
if request.session["dropbox-auth-csrf-token"] is None or request.session["dropbox-auth-csrf-token"] == "":
raise Exception("Problem with csrf")
except Exception, e:
#Get it from the parameter and add it to the session.
csrf = request.GET.get("state")
request.session["dropbox-auth-csrf-token"] = csrf
access_token, user_id, url_state = \
get_dropbox_auth_flow(request.session).finish(request.GET)
我不确定它是否可以添加到用于dropbox的Django库的整体修复,如果会话由于某种原因无效,则检查状态变量的请求参数。事实上,这可能是一个安全问题,目前它解决了我的注册问题。