У меня есть приложение 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
, но в данном конкретном случае, над которым я сейчас работаю, это работает.
Тем не менее, все еще ищем лучшие решения ...