2013-10-06 2 views
2

Я использую метод DropboxOAuth2Flow, описанный для API-интерфейса Dropbox v1.6 в приложении Django v1.5.3, и у меня возникает ошибка 400 при перенаправлении на страницу авторизации oauth2.Использовать API-интерфейс python dropbox с django

Когда я иду в мой dropbox_auth_start URL я попадаю на:

https://www.dropbox.com/1/oauth2/authorize?state=tWd4Eh4nzk5NlcuHXe7ffA%3D%3D&redirect_uri=http%3A%2F%2Fmydomain.com%2Fdropbox_auth_finish&response_type=code&client_id=blahblahblah

И тогда возникает ошибка 400.

К сожалению, в файле сеанса записано «dropbox-auth-csrf-token».

Мой Джанго код:

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), 
) 
+3

Похоже, вы используете HTTP? OAuth 2.0 требует URI переадресации HTTPS. – smarx

+0

Я только что создал сертификат ssl для своего сайта, добавил https в views.py, но я получаю тот же результат :( – Axel

+2

Вы уверены, что вы правильно настроили обратный вызов в консоли приложения? –

ответ

1

Как @smarx сказал, я только что перешел с HTTP и HTTPS, и все работало хорошо.

1

У меня недавно возникла проблема с этим, и моя ссылка на сайт всегда использовала ссылку https. Я не уверен, что мое решение полностью работоспособно или безопасно, но на данный момент оно останавливает ошибку, которая вызывает множество проблем с плохой регистрацией для моего сервиса.

Поскольку в некоторых случаях уровень сеанса Django не работает, когда пользователи перенаправляются на Dropbox и обратно, кажется, что токен CSRF передается обратно в ваше приложение в качестве параметра «состояние» в ответе обратного вызова. Мое решение состоит в том, чтобы проверить ваш обработчик вида для проверки подлинности, который проверяет наличие ключа сеанса csrf и если он не получает его из параметра «состояние» и добавляет его в сеанс перед вызовом потока проверки подлинности запроса на удаление.

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) 

Я не уверен, если это общее исправление, которое может быть добавлено в библиотеку Django для раздаточной, чтобы проверить параметр запроса для переменной состояния, если сеанс по какой-то причине не работает. Это может быть проблема безопасности, на данный момент она решает мои проблемы с регистрацией.

 Смежные вопросы

  • Нет связанных вопросов^_^