Использование Django OAuth-Toolkit для аутентификации на платформе Messenger - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть приложение Django, с которым я хочу общаться с помощью Messenger Platform (messenger chatbot). Для того чтобы связать свои учетные записи с чат-ботом, я добавил сервер аутентификации OAuth, следуя этому руководству: Django OAuth-Toolkit - Учебники - часть 1

Я использую Django OAuth-Toolkit с готовыми настройками. Все идет нормально. К сожалению, я понял, что поток аутентификации мессенджера не очень строго следует спецификациям OAuth2 (как также упоминалось здесь OT ). В частности, в OAuth2 ожидается, что сервер аутентификации перенаправит обратно на callback_uri /? Code = AUTHORIZATION_CODE , однако мессенджер ожидает authorization_code параметр вместо код один.

Так что теперь мне интересно, как проще всего изменить поведение Django OAuth-Toolkit и использовать ? Authorization_code = AUTHORIZATION_CODE или я делаю что-то совершенно неправильно.

Любая помощь очень ценится. Если кто-то уже использовал Django OAuth-Toolkit или обычный Django для подключения к Messenger Platform, некоторый пример кода был бы очень полезен.

UPDATE:

Я нашел (грязный) обходной путь, построив свой собственный FacebookAuthorizationView на основе обычного OAuth2 AuthorizationView, например:

from oauth2_provider.views.base import AuthorizationView
from oauth2_provider.exceptions import OAuthToolkitError
from oauth2_provider.models import get_access_token_model, get_application_model

"""
Facebook OAuth Provider View
"""

class FacebookAuthorizationView(AuthorizationView):
    """
    Customized Facebook Authorization view to handle Facebook's deviation from OAuth2 specs
    """

    def form_valid(self, form):
        client_id = form.cleaned_data["client_id"]
        application = get_application_model().objects.get(client_id=client_id)
        credentials = {
            "client_id": form.cleaned_data.get("client_id"),
            "redirect_uri": form.cleaned_data.get("redirect_uri"),
            "response_type": form.cleaned_data.get("response_type", None),
            "state": form.cleaned_data.get("state", None),
        }
        scopes = form.cleaned_data.get("scope")
        allow = form.cleaned_data.get("allow")

        try:
            uri, headers, body, status = self.create_authorization_response(
                request=self.request, scopes=scopes, credentials=credentials, allow=allow
            )
            uri = uri.replace("code=", "authorization_code=")
        except OAuthToolkitError as error:
            return self.error_response(error, application)

        self.success_url = uri
        logger.debug("Success url for the request: {0}".format(self.success_url))
        return self.redirect(self.success_url, application)

По сути, я только добавил 1 строку к исходному виду:

uri = uri.replace("code=", "authorization_code=")

, который просто заменяет параметр строки запроса code в URI перенаправления. Думаю, мне следует хотя бы использовать правильный форматировщик строки запроса URI для замены ключа, чтобы authorization_code не стал authorization_authorization_code, но в данном конкретном случае, над которым я сейчас работаю, это работает.

Тем не менее, все еще ищем лучшие решения ...

...