Управляйте социальными приложениями django-allauth с портала администратора

Во всех руководствах, которые я видел, django-allauth все настройки находятся в файле settings.py. Однако в итоге получается довольно сумбурно:

SOCIALACCOUNT_PROVIDERS = {
    "google": {
        "SCOPE": [
            "profile",
            "email",
        ],
        "AUTH_PARAMS": {
            "access_type": "online",
            "redirect_uri": "https://www.********.com/accounts/google/login/callback/",
        },
        "OAUTH_PKCE_ENABLED": True,
    }
}

SITE_ID = 1
SOCIALACCOUNT_ONLY = True
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_AUTHENTICATION_METHOD = 'email'
LOGIN_REDIRECT_URL = 'https://www.********.com/success/'
ROOT_URLCONF = 'gvautoreply.urls'

Итак, мой вопрос в том, как я могу полностью управлять социальными приложениями и их настройками с портала администратора? Я вижу, что есть поле настроек, в которое вводятся данные в формате JSON, но я не могу найти никакой документации о том, как его использовать.

Настройки в данном случае записываются с помощью json-запроса. (Обязательно нажмите Add Social Application) Я могу предположить, что аналогично тому, что у вас есть, это должно сработать:

{
    "SCOPE": ["profile", "email"],
    "AUTH_PARAMS": {
        "access_type": "online",
        "redirect_uri": "https://www.********.com/accounts/google/login/callback/"
    },
    "OAUTH_PKCE_ENABLED": true
}

Убедитесь, что OAUTH_PKCE_ENABLED имеет значение true. Поскольку SITE_ID, SOCIALACCOUNT_ONLY, ACCOUNT_EMAIL_VERIFICATION, ACCOUNT_EMAIL_REQUIRED, ACCOUNT_AUTHENTICATION_METHOD, и LOGIN_REDIRECT_URL являются глобальными, их все равно необходимо указать в настройках . Я думаю, что этот метод еще более сложный, чем обычный. И, возможно, здесь нет руководств, потому что это необычный способ. Эта настройка может вызвать проблемы с безопасностью и дублирование настроек в панели администратора и настройках.

upd: Похоже, что PKCE_REQUIRED используется вместо OAUTH_PKCE_ENABLED в соответствии с выпущенной версией django-allauth 0.52.0

(При использовании PKCE_REQUIRED убедитесь, что ваш поставщик OAuth поддерживает PKCE, поскольку не все поставщики могут поддерживать эту функцию)

Да. Вы можете свободно управлять этим из базы данных или из настроек, вот документация по вашему вопросу. Насколько я понимаю, раньше можно было устанавливать настройки провайдера исключительно с помощью базы данных, но в этой версии все изменилось. Вот цитата из первого документа:

Несмотря на то, что провайдеры с другими протоколами могут использовать другую терминологию, общая идея остается прежней. Во всем allauth термин “социальное приложение” (сокращенно “app”) относится к единице конфигурации провайдера. Вы предоставляете конфигурацию приложения либо в своем проекте settings.py, либо путем настройки экземпляров социальных приложений с помощью администратора Django.

Важно: а можно комбинировать оба способа, следует знать, вам нужно, чтобы избежать настроив один и тот же провайдер как через settings.py и SocialApp экземпляр. В этом случае неясно, какое приложение выбрать, что приводит к исключению MultipleObjectsReturned.

Например, это приведет к аналогичным результатам:

# settings.py

SOCIALACCOUNT_PROVIDERS = {  
    'google': {  
        'APP': {  
            'client_id': '123',  
            'secret': '456',  
            'key': '789',  
            'settings': {  
                'scope': [  
                    'profile',  
                    'email',  
                ],  
                'auth_params': {  
                    'access_type': 'online',  
                },  
                'oauth_pkce_enabled': True,  
            },  
        }  
    },  
}

Интерфейс администратора: admin

Но таким образом можно управлять не всеми настройками, а только теми настройками провайдера, которые необходимы для выполнения аутентификации. Например, существуют некоторые настройки, которые извлекаются из SOCIALACCOUNT_PROVIDERS['google'], и их нельзя установить из базы данных. Они задаются как константы в google словаре провайдера на верхнем уровне:

SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'FETCH_USERINFO': True,
    },
}

Или пример, который вы привели в вопросе:

SOCIALACCOUNT_PROVIDERS = {
    "google": {
        "SCOPE": [
            "profile",
            "email",
        ],
        "AUTH_PARAMS": {
            "access_type": "online",
            "redirect_uri": "https://www.********.com/accounts/google/login/callback/",
        },
        "OAUTH_PKCE_ENABLED": True,
    }
}

Это, по сути, общие настройки, которые имеют самый низкий приоритет, например, если в базе данных или в SOCIALACCOUNT_PROVIDERS['google']['APP'] вы не указали настройки для SCOPE, они будут использованы. Например, вы можете увидеть это здесь, в разделе методы: get_pkce_params, get_auth_params, get_scope.

В общем, весь этот код - довольно запутанный, и вам следует хорошенько постараться, чтобы его распутать. Но если вам интересно, вот цепочка того, как это работает:

  1. Здесь создайте google контроллеры и установите GoogleOAuth2Adapter в качестве адаптера.
  2. Тогда, например, при обработке google-callback здесь self.adapter.get_provider(), этот метод OAuth2Adapter.get_provider будет вызван с этими аргументами: get_adapter(self.request).get_provider(self.request,provider='google').
  3. Если вы ничего не меняли в настройках, ADAPTER это приведет к возврату DefaultSocialAccountAdapter и именно здесь вы можете увидеть, как выполняется поиск в настройках. Первоначально будет вызван метод get_provider , который вызовет ⇾ get_applist_apps в цепочке. На самом деле нас интересует последний метод, именно здесь происходит самое интересное. Сначала проверяется база данных, затем google['APPS'] или google['APP'], если параметр APPS не задан, в конечном итоге будет возвращен список экземпляров модели SocialApp.

Надеюсь, я ничего не пропустил, дайте мне знать, если вы чего-то не поняли, я постараюсь дополнить ответ.

Вернуться на верх