Управляйте социальными приложениями 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,
},
}
},
}
Но таким образом можно управлять не всеми настройками, а только теми настройками провайдера, которые необходимы для выполнения аутентификации. Например, существуют некоторые настройки, которые извлекаются из 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
.
В общем, весь этот код - довольно запутанный, и вам следует хорошенько постараться, чтобы его распутать. Но если вам интересно, вот цепочка того, как это работает:
- Здесь создайте
google
контроллеры и установитеGoogleOAuth2Adapter
в качестве адаптера. - Тогда, например, при обработке
google-callback
здесьself.adapter.get_provider()
, этот методOAuth2Adapter.get_provider
будет вызван с этими аргументами:get_adapter(self.request).get_provider(self.request,provider='google')
. - Если вы ничего не меняли в настройках,
ADAPTER
это приведет к возвратуDefaultSocialAccountAdapter
и именно здесь вы можете увидеть, как выполняется поиск в настройках. Первоначально будет вызван методget_provider
, который вызовет ⇾get_app
⇾list_apps
в цепочке. На самом деле нас интересует последний метод, именно здесь происходит самое интересное. Сначала проверяется база данных, затемgoogle['APPS']
илиgoogle['APP']
, если параметр APPS не задан, в конечном итоге будет возвращен список экземпляров моделиSocialApp
.
Надеюсь, я ничего не пропустил, дайте мне знать, если вы чего-то не поняли, я постараюсь дополнить ответ.