Django allauth авторизация через социальную сеть

17 октября 2017 г. 3:04

Django-allauth замечательный пакет для авторизации пользователей на своём сайте, который берёт на себя рутинные операции по регистрации пользователей обычным способом через форму, а также через популярные социальные сети.

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

На данный момент приложение поддерживает более 60 соц. сетей (провайдеров).

Кроме типичных полей Имя, Фамилия, Email и Пароль вы легко сможете добавить дополнительные поля. Также можно легко написать свою авторизацию через соц. сеть, если ее нет в списке поддерживаемых, так как провайдеры описаны через единый интерфейс, то есть уснаследуются от одного класса OAuth2Provider или OAuthProvider, который обрабатывает протокол авторизации OAuth 2 или OAuth соответственно.

Хорошо, что Django-allauth предоставляет возможность добавлять несколько email-ов пользователей и указывать основной. Бывает, что пользователь вдруг теряет контроль над одной какой-нибудь своей электронной почтой и тут приходят на помощь резервные email-ы, на которые могут прийти пароли или важные письма с вашего сайта.

Список всех преимуществ вы найдёте в официальной документации http://django-allauth.readthedocs.io/en/latest/index.html

Доверенный redirect URI

Во многих соц. сетях при добавлении приложения спрашивают про некий Доверенный redirect URI (или Действительные URL-адреса для перенаправления OAuth) например в ВК:

Доверенный redirect URI нужен для дополнительной защиты приложения от утечек токенов зарегистрировавшихся пользователей в следствие хакерских атак.

В django-allauth Доверенный redirect URI строится по следующему принципу:

http://[domain]/accounts/[provider]/login/callback/

где [domain] - домен сайта, а [provider] - социальная сеть (приложение) типа vk, google, facebook и т. д.

В некоторых приложениях, в том числе и в ВКонтакте, есть возможность протестировать авторизацию локально на девелоперской машине. Для этого обычно в настройки нужно добавить localhost в Базовые домены и http://localhost:8000/accounts/[provider]/login/callback/ в Доверенный redirect URI.

Дополнительная информация по использованию django-allauth для конкретных социальных приложений:

  1. Авторизация через социальную сеть Вконтакте
  2. Авторизация через социальную сеть Facebook
  3. Авторизация пользователей через Google

Простейший пример использования django-allauth

Устанавливаем и настраиваем django-allauth согласно документации http://django-allauth.readthedocs.io/en/latest/installation.html. Попробуем добавить авторизацию через ВКонтакте. Для начала нужно зарегистрировать своё приложение в VK.

Замечание
В разделе http://django-allauth.readthedocs.io/en/latest/providers.html размещены поддерживаемые провайдеры и ссылки на документацию по регистрации приложения в соответствующей соц. сети.

Затем нужно убедиться, что провайдер VK добавлен в INSTALLED_APPS. Мои настройки в settings.py для django-allauth выглядят так:

SITE_ID = 1

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.request',
            ],
        },
    },
]

AUTHENTICATION_BACKENDS = (
    ...
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

INSTALLED_APPS = (
    ...
    # The following apps are required:
    'django.contrib.auth',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',

    # ... include the providers you want to enable:
    'allauth.socialaccount.providers.vk',
    ...
)

В шаблоне:

{% load socialaccount %}
<a href="{% provider_login_url "vk" method="oauth2" %}"> Войти через VK </a>

Для вывода всех подключённых провайдеров, вы можете использовать следующий код:

{% load socialaccount %}
{% get_providers as socialaccount_providers %}

{% for provider in socialaccount_providers %}
    {% if provider.id == "openid" %}
        {% for brand in provider.get_brands %}
          <a title="{{brand.name}}" class="{{provider.id}} {{brand.id}}" href="{% provider_login_url provider.id openid=brand.openid_url process=process %}">{{brand.name}}</a>
        {% endfor %}
    {% endif %}
    <a title="{{provider.name}}" class="{{provider.id}}" href="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params %}">{{provider.name}}</a>
{% endfor %}

И наконец, нужно связать полученные при регистрации приложения client_ID и секретный ключ с сайтом. Для этого в админке перейдите в Социальные приложения и добавьте социальное приложение:

Часто используемые настройки django-alluath

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

ACCOUNT_EMAIL_REQUIRED = True  
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'

Количество попыток входа в систему я оставляю по умолчанию (равное 5), но время таймаута ограничиваю до 60 секунд:

ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 60

Часто требуются дополнительные поля при регистрации пользователей, поэтому я создаю дополнительную форму:

class CustomSignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': _('First name')}))
    last_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': _('Last name')}))

    GENDERS = (('man', _('Man')), ('woman', _('Woman')))
    gender = forms.ChoiceField(label=_('Gender'), choices=GENDERS, widget=forms.Select())

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.gender = self.cleaned_data['gender']

        user.save()

А затем подключаю её в settings.py:

ACCOUNT_SIGNUP_FORM_CLASS = 'spec.forms.CustomSignupForm'

Теперь при выводе формы в шаблоне, мы увидим не только базовые поля (email и пароль), но и свои дополнительные поля. Получить такую форму в коде можно так:

# -*- coding: utf-8 -*-
from allauth.account.forms import LoginForm, SignupForm


def show_auth(request):
    return render(request, 'auth.html', {'singup_form': SignupForm(), 'login_form': LoginForm()})

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

# settings.py
SOCIALACCOUNT_AUTO_SIGNUP = False

И очень полезная настройка - кастомный редирект после входа на сайт:

# settings.py
ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'

# spec/adapter.py
from django.conf import settings
from allauth.account.adapter import DefaultAccountAdapter

class MyAccountAdapter(DefaultAccountAdapter):

    def get_login_redirect_url(self, request):
        return '/users/{}/'.format(request.user.username)

Ошибка resp.json()['response'][0] KeyError: 'response' для VK провайдера

Данная ошибка возникает в версиях allauth ниже 0.36.0 из-за того, что ВКонтакте изменили api, сделав параметр v обязательным (v - версия api vk).

1-ый вариант решения: обновить allauth до версии 0.36.0

В allauth версии 0.36.0 этот параметр добавили, поэтому обновите allauth до указанной версии и всё должно заработать.

2-ой вариант решения: переопределить VK провайдер

Если по каким-то причинам не хотите обновлять allauth, то вы можете и другим способом решеть проблему, добавив свой кастомный VK провайдер. Для этого нужно скопировать провайдер vk из приложения allauth (находится в allauth/socialaccount/providers/vk/) куда-нибудь в своё приложение, например, spec/providers/vk.

Добавляем в файле spec/providers/vk/views.py параметр 'v': '5.101', в словарь params в функции complete_login класса VKOAuth2Adapter. Полный листинг приведён ниже:

import requests

from allauth.socialaccount.providers.oauth2.views import (
    OAuth2Adapter,
    OAuth2CallbackView,
    OAuth2LoginView,
)

from .provider import VKProvider

USER_FIELDS = ['first_name',
               'last_name',
               'nickname',
               'screen_name',
               'sex',
               'bdate',
               'city',
               'country',
               'timezone',
               'photo',
               'photo_medium',
               'photo_big',
               'photo_max_orig',
               'has_mobile',
               'contacts',
               'education',
               'online',
               'counters',
               'relation',
               'last_seen',
               'activity',
               'universities']


class VKOAuth2Adapter(OAuth2Adapter):
    provider_id = VKProvider.id
    access_token_url = 'https://oauth.vk.com/access_token'
    authorize_url = 'https://oauth.vk.com/authorize'
    profile_url = 'https://api.vk.com/method/users.get'

    def complete_login(self, request, app, token, **kwargs):
        uid = kwargs['response'].get('user_id')
        params = {
            'v': '5.101',
            'access_token': token.token,
            'fields': ','.join(USER_FIELDS),
        }
        if uid:
            params['user_ids'] = uid
        resp = requests.get(self.profile_url,
                            params=params)
        resp.raise_for_status()
        extra_data = resp.json()['response'][0]
        email = kwargs['response'].get('email')
        if email:
            extra_data['email'] = email
        return self.get_provider().sociallogin_from_response(request,
                                                             extra_data)


oauth2_login = OAuth2LoginView.adapter_view(VKOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(VKOAuth2Adapter)

Затем в INSTALLED_APPS строчку 'allauth.socialaccount.providers.vk', заменить на 'spec.providers.vk',

Обратите внимание, что для старых версий allauth, необходимо также поменять параметр package в классе VKProvider на 'spec.providers.vk' (спасибо Александру за комментарий), а также в методе extract_uid(self, data) вернуть str(data['id']):

...

class VKProvider(OAuth2Provider):
    id = 'vk'
    name = 'VK'
    package = 'spec.providers.vk'
    account_class = VKAccount
    
    def get_default_scope(self):
        scope = []
        if app_settings.QUERY_EMAIL:
            scope.append('email')
        return scope

    def extract_uid(self, data):
        return str(data['id'])

    def extract_common_fields(self, data):
        return dict(email=data.get('email'),
                    last_name=data.get('last_name'),
                    username=data.get('screen_name'),
                    first_name=data.get('first_name'))


provider_classes = [VKProvider]

Теперь должно работать.

Использование django-allauth для конкретных приложений

  1. Авторизация через социальную сеть Вконтакте
  2. Авторизация через социальную сеть Facebook
  3. Авторизация пользователей через Google

Оцените статью

4.9 из 5 (всего 7 оценок)

captcha
Отмеченные звёздочкой поля ( * ) являются обязательными для заполнения.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Артём Мальцев

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/it/allauth/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Артём Мальцев
Ссылка на статью: <a href="https://vivazzi.pro/ru/it/allauth/">https://vivazzi.pro/ru/it/allauth/</a>

Больше: Правила использования сайта

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

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

Комментарии: 70

Goodwin Oz
Goodwin Oz

04.04.2018 13:16 #

Третий день мучаюсь, не понимаю в чем может быть ошибка "KeyError at /accounts/vk/login/callback/ 'response'" не подскажите в чем может быть проблема?

Ответить

Артём Мальцев
Артём Мальцев автор

05.04.2018 8:26 #

Покажите полный трейсбек.
А вообще похоже в данных (которые приходят на url /accounts/vk/login/callback/) нет ключа response. Нужно посмотреть, какие данные приходят с этого урла. Скорее всего error какой-нибудь.

Ответить

Goodwin Oz
Goodwin Oz

05.04.2018 12:24 #

Internal Server Error: /accounts/vk/login/callback/
Traceback (most recent call last):
  File "C:\Development\my_blog\blog\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Development\my_blog\blog\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Development\my_blog\blog\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Development\my_blog\blog\lib\site-packages\allauth\socialaccount\providers\oauth2\views.py", line 73, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Development\my_blog\blog\lib\site-packages\allauth\socialaccount\providers\oauth2\views.py", line 134, in dispatch
    response=access_token)
  File "C:\Development\my_blog\blog\lib\site-packages\allauth\socialaccount\providers\vk\views.py", line 53, in complete_login
    extra_data = resp.json()['response'][0]
KeyError: 'response'
[05/Apr/2018 15:23:19] "GET /accounts/vk/login/callback/?code=e56a6eac81244665a6&amp;state=QmdSrELVWbeO HTTP/1.1" 500 85411

Ответить

Артём Мальцев
Артём Мальцев автор

06.04.2018 2:17 #

Да, я был прав, всё-таки в ответе resp.json() нет ключа 'response'. Что-то другое приходит (скорее всего error). Попробуйте подебажить строку: File "C:\Development\my_blog\blog\lib\site-packages\allauth\socialaccount\providers\vk\views.py", line 53, - посмотрите, что возвращает resp.json() - поймёте, что за ошибка.

Скорее всего ваша ошибка связана с самой настройкой приложения. Вот попробуйте почитать этот материал : https://vivazzi.pro/it/auth-vk/

Ответить

Goodwin Oz
Goodwin Oz

06.04.2018 6:40 #

Спасибо вам огромное, за советы. Просто видимо я ещё не дорос до этого и пока придётся обходиться джанговской авторизацией, без социальных аккаунов, в ней хотя бы разобрался. :)

Ответить

Артём Мальцев
Артём Мальцев автор

09.04.2018 0:53 #

Пожалуйста, рад помочь ! Если есть вопрос как дебажить, вот попробуйте посмотреть https://www.youtube.com/watch?v=QJtWxm12Eo0 - рассказывает о дебаге в PyCharm . Удачи вам в освоении!

Ответить

Артём Мальцев
Артём Мальцев автор

11.05.2018 4:48 #

Вот решение вашей проблемы: https://vivazzi.pro/it/allauth/#comment_128

Ответить

Кирилл
Кирилл

08.04.2018 19:33 #

А что делать если локально получается авторизоваться, а при деплое - нет . Проблема в редиректе на callback - этот колбек отсылает снова авторизоваться в соц.сеть . Проблема наблюдается с vk и instagram и только на production сервере

Ответить

Артём Мальцев
Артём Мальцев автор

09.04.2018 0:58 #

Странное поведение. В Instagram не подскажу, а вот в вк: вы добавили два базовых домена (напр., localhost и yoursite.ru?) и настроили два callback-а (http://localhost:8000/accounts/vk/login/callback/ и http://yoursite.ru/accounts/vk/login/callback/) в настройках приложения? Смотрели https://vivazzi.pro/it/auth-vk/ ? я там подробно описал авторизацию через ВК.

Ответить

Кирилл
Кирилл

09.04.2018 5:52 #

Решилось, просто обновить библиотеку на продакшене нужно было. Спасибо

Ответить

Гость
Гость

27.04.2018 11:37 #

Не работает авторизация через vk вообще ни через виджет ни средствами DLE. Страница перезагружается, авторизации не происходит

Ответить

Артём Мальцев
Артём Мальцев автор

29.04.2018 14:13 #

ВКонтакте изменили api, сделав параметр v обязательным (v - версия api vk) . В allauth версии 0.36.0 этот параметр добавили, поэтому обновите allauth до указанной версии и всё будет работать . Также можно попробовать другой способ, описанный в разделе Ошибка resp.json()['response'][0] KeyError: 'response' для VK провайдера в данной статье.

Ответить

Станислав
Станислав

28.08.2019 9:24 #

Обновление не помогает (версия django-allauth==0.39.1) та же ошибка.

{'error': {'error_code': 8,
           'error_msg': 'Invalid request: versions below 5.00 are deprecated. '
                        'Version param should be passed as "v". "version" '
                        'param is invalid and not supported. For more '
                        'information go to '
                        'https://vk.com/dev/version_update_2.0',
           'request_params': [{'key': 'v', 'value': '3.0'},

Придется использовать другой способ.

Ответить

Станислав
Станислав

28.08.2019 12:45 #

Может кому пригодится.
Использовал 2ой вариант, переделал VK провайдер.

1. views.py строка 45:
 'v': '3.0', -> 'v': '5.101',
2. providers.py строка 40:
return str(data['uid']) -> return str(data['id'])

Работает.

Ответить

Артём Мальцев
Артём Мальцев автор

04.09.2019 2:35 #

Станислав, благодарю, что поделились рабочим вариантом!

Да, в новых версиях vk api вместо uid нужно использовать id

Ответить

Гость
Гость

01.05.2018 13:01 #

К посту выше: вот такая ошибка появляется в resp.json() {'error': {'error_code': 8, 'error_msg': 'Invalid request: v (version) is required',

Ответить

Артём Мальцев
Артём Мальцев автор

03.05.2018 2:14 #

Да, всё верно. Попробуйте как я описал в посте https://vivazzi.pro/it/allauth/#comment_128

Это должно помочь

Ответить

Андрей
Андрей

21.06.2018 18:49 #

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

ConnectionRefusedError at /accounts/signup/
[WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение
Request Method: POST
Request URL:    http://127.0.0.1/accounts/signup/
Django Version: 2.0.6
Exception Type: ConnectionRefusedError
Exception Value:    
[WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение
Exception Location: C:\Users\python\AppData\Local\Programs\Python\Python37\lib\socket.py in create_connection, line 716
Python Executable:  C:\Users\python\AppData\Local\Programs\Python\Python37\python.exe
Python Version: 3.7.0
Python Path:    
['C:\\djangoprojects',
 'C:\\Users\\python\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip',
 'C:\\Users\\python\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',
 'C:\\Users\\python\\AppData\\Local\\Programs\\Python\\Python37\\lib',
 'C:\\Users\\python\\AppData\\Local\\Programs\\Python\\Python37',
 'C:\\Users\\python\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Server time:    Thu, 21 Jun 2018 21:47:38 +0300 

что я делаю не так?(

Ответить

Артём Мальцев
Артём Мальцев автор

22.06.2018 2:34 #

Андрей, ни разу с такой ошибкой даже близко не сталкивался. Навряд ли смогу помочь.. Попробовал по-быстренькому погуглить, но отсылки идут к сокетам (хотя это и в трейсбеке видно, что там что-то случилось) - без воспроизведения ошибки не могу понять, как исправить ошибку. Попробуйте подебажить это дело C:\Users\python\AppData\Local\Programs\Python\Python37\lib\socket.py

Ответить

Андрей
Андрей

22.06.2018 8:41 #

Ошибка конечно малоинформативная, все свелось к тому, что у меня не была настроена отправка почта. Помогла ваша статья https://vivazzi.pro/it/send-email-in-django/

Ответить

Артём Мальцев
Артём Мальцев автор

22.06.2018 13:55 #

О, как! Неожиданно, что из-за неправильных настроек почты такая ошибка возникает :)

Рад, что у вас получилось разобраться!

Ответить

Бернар Бернар
Бернар Бернар

29.06.2018 4:45 #

при входе с разных соц сетей с одинаковым еmail у меня возникает ошибка

ConnectionRefusedError at /accounts/social/signup /

[Errno 111] Connection refuse d

Request Method: POS T Request URL: https://hitparad.kz/accounts/social/signup / Django Version: 2.0. 6 Exception Type: ConnectionRefusedErro r Exception Value:

[Errno 111] Connection refuse d

Exception Location: /usr/lib/python3.6/socket.py in create_connection, line 71 3 Python Executable: /var/www/hitparad.kz/my_env/bin/pytho n Python Version: 3.6. 3 Python Path:

['/var/www/hitparad.kz/httpdocs/polling' , '/var/www/hitparad.kz/my_env/bin' , '/usr/lib/python36.zip' , '/usr/lib/python3.6' , '/usr/lib/python3.6/lib-dynload' , '/var/www/hitparad.kz/my_env/lib/python3.6/site-packages' , '/var/www/hitparad.kz/my_env/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg' , '/var/www/hitparad.kz/my_env/lib/python3.6/site-packages/pip-10.0.1-py3.6.egg' ]

Server time: Пт, 29 Июн 2018 10:45:36 +0600

Ответить

Артём Мальцев
Артём Мальцев автор

08.07.2018 10:54 #

Вообще должно быть так: при совпадении email должно перенаправляться на страницу регистрации.
Как вариант можно принудительно отправлять на форму регистрации, добавив SOCIALACCOUNT_AUTO_SIGNUP = False в settings.py пока проблема не решится.
У вас получилось справится с проблемой?

Ответить

Paul Winex
Paul Winex

01.07.2018 8:07 #

Спасибо за статью. ПРобую настроить несколько соц сетей но пока ни одна не поддаётся. В частности с Vk пролема возникла в самом начале:
Добавил в settings приложение

...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.vk',

url тоже проипсал. Создал приложение в базе с ID и ключём, там де доверенный url на localhost.
При переходе по ссылке авторизации
Войти через VK
вот такая ошибка

Internal Server Error: /accounts/vk/login/
Traceback (most recent call last):
  File "/home/paul/server/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/home/paul/server/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/paul/server/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/paul/server/env/lib/python3.6/site-packages/allauth/socialaccount/providers/oauth2/views.py", line 73, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/paul/server/env/lib/python3.6/site-packages/allauth/socialaccount/providers/oauth2/views.py", line 96, in dispatch
    app = provider.get_app(self.request)
  File "/home/paul/server/env/lib/python3.6/site-packages/allauth/socialaccount/providers/base.py", line 52, in get_app
    return SocialApp.objects.get_current(self.id, request)
  File "/home/paul/server/env/lib/python3.6/site-packages/allauth/socialaccount/models.py", line 34, in get_current
    provider=provider)
  File "/home/paul/server/env/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/paul/server/env/lib/python3.6/site-packages/django/db/models/query.py", line 403, in get
    self.model._meta.object_name
allauth.socialaccount.models.DoesNotExist: SocialApp matching query does not exist.
[01/Jul/2018 07:58:51] "GET /accounts/vk/login/?method=oauth2 HTTP/1.1" 500 93073

Django 2, django-allauth 0.36.0, python 3.6

Ответить

Paul Winex
Paul Winex

01.07.2018 8:08 #

К сожалению форматирование кода в коменте слетело(

Ответить

Артём Мальцев
Артём Мальцев автор

08.07.2018 11:11 #

allauth.socialaccount.models.DoesNotExist: SocialApp matching query does not exist. - по идее говорит о том, что вы не добавили социальное приложение VK в админку. Проверьте ещё раз все настройки, описанные в статье https://vivazzi.pro/it/auth-vk/

Ответить

Paul Winex
Paul Winex

08.07.2018 16:00 #

Спасибо за ответ. Да я много чего там накосячил, может даже не добавил приложение. Но в данный момент всё уже работает. Только пришлось немного подшаманить с оригинальным сервером чтобы он правильно работал с EmailUser. Я читал в документации что он работает из коробки именно с таким юзером, но там остается обязательным наличие поля username, которого у меня нет. Пришлось немного покостылять . Вопрос всё равно имеется. Сейчас в дефолтной вьюшке Login происходит вызов метода login без указания backend, что приводит к ошибке, так как у нас в списке указано два бэкэнда и django не знает какой брать. Приходится явно указывать. Быть может гдето в недрах allauth есть готовый login метод с учётом данной особенности? Сейчас имеется в виду логин дефолтный через username+password без участия соц аккаунтов, то есть django.contrib.auth.backends.ModelBackend

Ответить

Артём Мальцев
Артём Мальцев автор

09.07.2018 1:21 #

У вас в таком порядке располагаются бэкенды?

AUTHENTICATION_BACKENDS = (
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
)
@python_2_unicode_compatible
class User(models.Model, AbstractUser):
    middle_name = models.CharField(_('Middle Name'), max_length=30, blank=True)
    # and other custom fields...

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.get_username()

Ещё настройки settings.py:

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 60

Ответить

Александр
Александр

25.12.2018 10:23 #

У меня allauth==0.24. 1 Ошибку resp.json()['response'][0] KeyError: 'response' для VK провайдера исправлял по 2-ому варианту . Но нужно было еще в скопированном provider.py сделать правку - в классе VKProvider изменить значение параметра package на 'spec.providers.vk'.

Ответить

Артём Мальцев
Артём Мальцев автор

26.12.2018 9:23 #

Александр, действительно в более старых версиях ещё и параметр package есть в классе VKProvider .

Дополнил статью - благодарю за комментарий и вклад в развитие статьи!

Ответить

Phantom
Phantom

28.07.2019 11:58 #

Reverse for 'facebook_login' not found. 'facebook_login' is not a valid view function or pattern name.

8   
9     {{brand.name}}
13  
14  {% endfor %}
15  {% endif %}
16  
17    {{provider.name}}
19  
20  {% endfor %}

В чем проблема? Такая же ситуация с vk. Пробую запускать локально

Ответить

Артём Мальцев
Артём Мальцев автор

25.11.2019 2:45 #

Проверьте, что добавлен в settings.py:


urlpatterns = [
    ...
    url(r'^accounts/', include('allauth.urls')),
    ...
]

А также, что добавлен 'allauth.socialaccount.providers.facebook' в INSTALLED_APPS

Ответить

Гость
Гость

19.11.2023 18:05 #

Вы как то решили проблему?

Ответить

Rampl Ramplovich
Rampl Ramplovich

23.11.2019 15:37 #

Здравствуйте, подскажите пожалуйста, как при использовании django allauth сделать, чтобы после авторизации на сайте подгружались 5 рандомных друзей из вк

Ответить

Артём Мальцев
Артём Мальцев автор

25.11.2019 2:48 #

Добрый день, Rampl!

Вот здесь нужно найти нужный API: https://vk.com/dev/friends

https://vk.com/dev/friends.get - вот должно решить вашу задачу

Ответить

Робин Алиханов
Робин Алиханов

06.02.2020 10:44 #

Привет всем, ребята не подскажете , на локальной машине можно сделать авторизацию через соц сеть ? просто заранее мучаться не хочу если на сервер через месяц или два закину

Ответить

Артём Мальцев
Артём Мальцев автор

07.02.2020 2:16 #

Привет, Робин!
Вот в этом разделе описано, как это сделать: https://vivazzi.pro/it/allauth/#doverennyy-redirect-uri

В некоторых приложениях, в том числе и в ВКонтакте, есть возможность протестировать авторизацию локально на девелоперской машине. Для этого обычно в настройки нужно добавить localhost в Базовые домены и http://localhost:8000/accounts/[provider]/login/callback/ в Доверенный redirect URI.

Ответить

Робин Алиханов
Робин Алиханов

07.02.2020 10:28 #

спасибо, все заработало)

Ответить

Артём Мальцев
Артём Мальцев автор

07.02.2020 18:33 #

Это хорошо! :)

Ответить

NIKIKII
NIKIKII

04.04.2020 17:00 #

А как установить картинку на вывод ссылки на регистрацию через соц.сети?

Ответить

Артём Мальцев
Артём Мальцев автор

05.04.2020 5:38 #

Если я правильно понял вопрос, это нужно через настройки приложения делать. Например, для ВК картинку можно задать здесь: https://vk.com/apps?act=manage в редактировании приложения

Ответить

Razilator
Razilator

05.05.2020 14:13 #

А как при авторизации через вк или другую соц.сеть перехватить аватарку для своей переопределенной модели?

Ответить

Артём Мальцев
Артём Мальцев автор

06.05.2020 0:28 #

Когда user регистрируется на сайте, то вычисляется его avatar_url методом get_avatar_url():

class VKAccount(ProviderAccount):
    def get_profile_url(self):
        return 'https://vk.com/id%s' % self.account.extra_data.get('uid')

    def get_avatar_url(self):
        ret = None
        photo_big_url = self.account.extra_data.get('photo_big')
        photo_medium_url = self.account.extra_data.get('photo_medium')
        if photo_big_url:
            return photo_big_url
        elif photo_medium_url:
            return photo_medium_url
        else:
            return ret

    def to_str(self):
        first_name = self.account.extra_data.get('first_name', '')
        last_name = self.account.extra_data.get('last_name', '')
        name = ' '.join([first_name, last_name]).strip()
        return name or super(VKAccount, self).to_str()

Можно по url, который возвращается методом get_avatar_url(), скачать фото, например, через requests.get(), если нужно.

Ответить

проходил мимо
проходил мимо

24.01.2021 23:09 #

А как выводить значения полей, который мы получили в социальном провайдере? Например, я хочу получить:

"city"  ,
"photo"  ,
"photo_medium"  ,

Например: {{ user.photo_medium }} - ничего не выводит

Ответить

Артём Мальцев
Артём Мальцев автор

26.01.2021 11:43 #

Можно посмотреть, что находится в user, например, так {{ user|debug }}, где debug - это простой кастомный фильтр


@register.filter
def debug(v, p=None):
    return v  # здесь поставить точку останова и посмотреть какие есть значения

Сами поля настраиваются в кастомном провайдере, как написано в разделе https://vivazzi.pro/it/allauth/?edit_off=true#2-oy-variant-resheniya-pereopredelit-vk-provayder

Ответить

проходилмимо
проходилмимо

24.01.2021 11:34 #

У вас синтаксическая ошибка (не хватает закрывающей кавычки в первом choice):
GENDERS = (('human(вот тут), ('Human')), ('woman', ('Woman')))

Ответить

Артём Мальцев
Артём Мальцев автор

26.01.2021 11:35 #

Благодарю! Исправил :)

Ответить

Михаил Болеев
Михаил Болеев

28.03.2021 6:07 #

Добрый день. Пытаюсь авторизоваться через Яндекс. Делаю так как указано в документации allauth: URL-адрес обратного вызова: https://oauth.yandex.com/verification_code
(делал и так: http: // localhost: 8000 / accounts / yandex / login / callback /)
Выдает ошибку: 400

redirect_uri does not match the Callback URL defined for the client

В стоке браузера: https://oauth.yandex.com/authorize?client_id=***&redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Faccounts%2Fyandex%2Flogin%2Fcallback%2F&scope=login%3Ainfo&response_type=code&state=4fBVLUuAAzmz

В чем может быть причина? P.S. Настроил авторизацию через другие сети (VK, google, OK).

Ответить

Артём Мальцев
Артём Мальцев автор

29.03.2021 9:35 #

Михаил, добрый день!
Я авторизацию через Яндекс не настраивал, когда он перешёл на авторизацию по протоколу OAuth 2.0. По идее всё должно также работать, как и с другими соц. сетями. Принцип один и тот же. На странице https://oauth.yandex.com/ и выбрав своё приложение в списке - в открывшейся странице нужно написать http://localhost: 8000/accounts/yandex/login/callback/, если тестировать локально. Но иногда это может не сработать, а будет работать только на самом сайте https://my-site.com/accounts/yandex/login/callback/ - у меня была такая проблема с одной соц. сетью (сейчас уже и не вспомню с какой). Точно знаю, что ВК позволяет localhost: 8000 использовать в качестве доверенных url.
На самом сайте пробовали авторизацию через Яндекс?

П. С. Я убрал client_id с вашего сообщения - его нельзя никому показывать. Когда у вас получится авторизация через Яндекс, рекомендую, обновить client_id (удалить приложение с Яндекса и снова создать и настроить).

Ответить

Михаил Болеев
Михаил Болеев

29.03.2021 11:51 #

Спасибо за ответ. Мне сказали на одном ресурсе, что Яндекс не работает с локальными хостам. Та что Вы правы, наверное.

Ответить

Михаил Болеев
Михаил Болеев

31.03.2021 3:26 #

Добрый день! Удалось все же настроить авторизацию. Изменил значение (взял данные из адресной строки браузера):
Callback URL: 127.0.0.1:8000/accounts/yandex/login/callback
Потребовалась регистрация нового приложения. Может Вам полезна будет эта информация. ))

Ответить

Артём Мальцев
Артём Мальцев автор

04.04.2021 12:24 #

Я правильно понимаю, что вместо localhost нужно было написать 127.0.0.1:8000

Ответить

Михаил Болеев
Михаил Болеев

06.04.2021 11:39 #

Думаю, что нет. Это одно и то же. Но могу проверить. ))

Ответить

Артём Мальцев
Артём Мальцев автор

06.04.2021 11:45 #

Вообще да, это одно и тоже и если с 127.0.0.1:8000 работает, то и с localhost:8000 должно сработать :)

Ответить

Михаил Болеев
Михаил Болеев

06.04.2021 11:45 #

Проверил. Это действительно так: localhost не катит. ))

Ответить

Михаил Болеев
Михаил Болеев

06.04.2021 12:47 #

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

Ответить

Артём Мальцев
Артём Мальцев автор

12.04.2021 11:19 #

Да, возможно :) честно, как и писал, с Яндексом не работал.
В любом случае большое спасибо за информацию - думаю, многим она будет полезна!

И мне пригодится, когда буду авторизацию через Яндекс подключать ))

Ответить

Михаил Болеев
Михаил Болеев

29.03.2021 17:36 #

А про mail.ru Вам что-нибудь известно? Как настроить приложение применительно к django?

Ответить

Артём Мальцев
Артём Мальцев автор

04.04.2021 12:26 #

С mail.ru я тоже не работал, но настройка должна быть аналогичная. К Django mail и прикручивается, то есть django-alauth и ориентирован на django или может я вопрос не понял?

Ответить

Михаил Болеев
Михаил Болеев

12.04.2021 15:34 #

Дело в том, что авторизация ругается на то, что id не тот . У меня моё приложение для авторизации перебрасывает на страницу: https://connect.mail.ru/oauth/authorize?client_id=.....................................&redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Faccounts%2Fmailru%2Flogin%2Fcallback%2F&scope=&response_type=code&state=niORdzjpmDC b

Возникает ошибка . Я пробовал сделать, как указано на сайте : Я вешаю на кнопку адрес ссылки на:

Но меня перебрасывает на страницу : https://mail.ru/?client_id=...............................&response_type=code%20%20%20%20&scope=userinfo%20%20%20%20&redirect_uri=http://127.0.0.1:8000/registr/%20%20%20%20&state=some_stat e

Почему? Что не так? Информация взята из документации на mail.ru.

Ответить

Михаил Болеев
Михаил Болеев

12.04.2021 15:40 #

Не хочет вставляться код.

a class="social mail" href="https://oauth.mail.ru/login
    ?client_id=...
    &amp;response_type=code
    &amp;scope=userinfo
    &amp;redirect_uri=http://127.0.0.1:8000/registr/
    &amp;state=some_state"

Ответить

Артём Мальцев
Артём Мальцев автор

18.04.2021 3:34 #

Нужно детально разбираться и воспроизвести у себя, поэтому я сходу не смогу подсказать в этом вопросе . Может поддержка mail поможет?

Ответить

Михаил Болеев
Михаил Болеев

18.04.2021 11:52 #

Спасибо! Поддержка mail.ru давно ушла в тину. ))

Ответить

Костя
Костя

11.05.2022 8:00 #

Ввожу в настройках вк redirect uri http://konstantin07.pythonanywhere.com/accounts/vk/login/callback / Получаю ответ от ap i {"error":"invalid_request","error_description":"redirect_uri is incorrect, check application redirect uri in the settings page" } Не подскажете в чём ошибка?

Ответить

Костя
Костя

11.05.2022 10:39 #

при этом если тестировать локально, то всё работает

Ответить

Костя
Костя

11.05.2022 11:15 #

всё решил

Ответить

Артём Мальцев
Артём Мальцев автор

17.07.2022 17:00 #

Отлично! Я тут со своими проектами занялся, немного несвоевременно начал отвечать на сообщения, но я вернулся)

Ответить

Гость
Гость

18.11.2023 20:25 #

добрый день, при разработке на локальном компьютере и тестировании сайта все работает allauth авторизация в ВК работает как часы. Проблема возникла при выкладывании сайта на сервер. Все делаю тоже самое, но в маршрутах никак не хочет появляться

> 
> admin/
> accounts/ signup/ [name='account_signup']
> accounts/ login/ [name='account_login']
> accounts/ logout/ [name='account_logout']
> accounts/ reauthenticate/ [name='account_reauthenticate']
> accounts/ password/change/ [name='account_change_password']
> accounts/ password/set/ [name='account_set_password']
> accounts/ inactive/ [name='account_inactive']
> accounts/ email/ [name='account_email']
> accounts/ confirm-email/ [name='account_email_verification_sent']
> accounts/ ^confirm-email/(?P[-:\w]+)/$ [name='account_confirm_email']
> accounts/ password/reset/ [name='account_reset_password']
> accounts/ password/reset/done/ [name='account_reset_password_done']
> accounts/ ^password/reset/key/(?P[0-9A-Za-z]+)-(?P.+)/$ [name='account_reset_password_from_key']
> accounts/ password/reset/key/done/ [name='account_reset_password_from_key_done']
> accounts/ social/

Ответить

Гость
Гость

18.11.2023 20:26 #

Кто то сталкивался с подобной проблемой?

Ответить

Гость
Гость

18.11.2023 20:30 #

Та же самая проблема, что и у пользователя Phantom от 28.07.2019 11:5 8 добавлен 'allauth.socialaccount.providers.vk' в INSTALLED_APP S регистрация по логину и пароля работает . но Using the URLconf defined in market.urls, Django tried these URL patterns, in this order : не видит не одного добавленного провайдера в INSTALLED_APPS

Ответить

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц