Как получить адрес электронной почты от Linkedin, используя Аллаута в Django? - PullRequest
0 голосов
/ 25 марта 2019

Я хочу зарегистрировать пользователей с помощью Linkedin, чтобы получить их имя, фамилию и адрес электронной почты.Для этого я использую Аллаута на Джанго.Я могу зарегистрировать имя и фамилию, но не могу автоматически сохранить электронное письмо из данных.

Глядя в начало ›Социальные учетные записи› Социальные учетные записи ›" the_user "на Дополнительные данные: {" elements ": [{" handle ":" urn: li: emailAddress: 152954186 "," handle ~ ": {"emailAddress": "example@example.com"}}], "firstName": {....Я вижу, что код извлекает письмо, но не сохраняет его.

Проверка выбора * из auth_user (из базы данных) или в Домашняя страница ›Аутентификация и авторизация› Пользователи, я вижу, что код не сохраняет электронную почту автоматически.Я полагаю, что код извлекает имя и фамилию, так как эти элементы не находятся внутри массивов.

У моего приложения-мультфильма есть разрешения r_emailaddress, r_liteprofile и w_member_social, и я использую OAuth 2.0.

В настройках.py:

ALLOWED_HOSTS = ['localhost']

INSTALLED_APPS = [
...
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.facebook',
    'allauth.socialaccount.providers.linkedin_oauth2',
]
SOCIALACCOUNT_QUERY_EMAIL = True

SOCIALACCOUNT_PROVIDERS = \
{
'linkedin_oauth2': {
        'SCOPE': [
            'r_liteprofile',
            'r_emailaddress',
            'w_member_social',
        ],
        'PROFILE_FIELDS': [
            'id',
            'firstName',
            'lastName',
            'emailAddress',
            'email-address',
            'profilePicture',
            'public-profile-url',
        ],
        'LOCATION_FIELDS': [
            'location',
        ],
        'POSITION_FIELDS': [
            'company',
        ]
    }
}

SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY = 'secret'  # App ID
SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET ='secret' #app key

и в register.html

{% extends "main/index.html" %}
{% load socialaccount %}

{% block content %}
    <form method="post">{% csrf_token %}
        <p>Datos Registro:</p>
        {{ form.as_p }}

        <input type="submit" value="Register">
    </form>

    If you have an account, <a href="login">login</a> instead.

    <br>
    <a href="{% provider_login_url "facebook" method="oauth2" %}">Facebook OAuth2</a>
    <a href="{% provider_login_url "linkedin_oauth2" method="oauth2" %}">Linkedin OAuth2</a>
{% endblock %}

и в url.py приложения

urlpatterns = [
...
    path('accounts/', include('allauth.urls')),
]

То, что я хочу, это кодавтоматически сохранять элемент электронной почты в столбце auth_user.email.Я мог бы сделать это с помощью триггера в базе данных, но это неправильно для меня.

Пожалуйста, помогите мне в успешном хранении данных на пути Django

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я не правильно проверил ситуацию.Письмо, которое я пытался сохранить, уже было зарегистрировано на account_emailaddress , эта таблица имеет уникальное ограничение для столбца электронной почты, поэтому я не могу сохранить то же самое электронное письмо от другого socialaccount_socialaccount (таблицы для хранения зарегистрированного пользователя изсоциальные сети).Удаление записи из account_emailaddress решит эту проблему.

Сразу после этого я получил ошибку ConnectionRefusedError в / accounts / linkedin_oauth2 / login / callback /, которая была решена путем кодирования в settings.py

ACCOUNT_EMAIL_VERIFICATION = 'none'

, как указано там https://github.com/pennersr/django-allauth/issues/1740.

0 голосов
/ 26 марта 2019

Allauth обеспечивает хранение нескольких электронных писем для одного пользователя через объект EmailAddress, который включает в себя поле verified и поле primary.Объект Allauth EmailAddress, сохраненный как основной адрес электронной почты, будет автоматически скопировать адрес электронной почты в поле email в модели пользователя (auth_user в вашем случае), когда объект EmailAddressсохраняетсяПоэтому вы можете сделать что-то вроде следующего:

from allauth.account.models import EmailAddress

email, created = EmailAddress.objects.get_or_create(user=request.user, email= email_address_from_linked_in , verified=True, primary=True)

if not created:
    email.primary = True
    email.save()

Опять же,ключ должен установить primary для EmailAddress равным True, чтобы адрес электронной почты автоматически копировался в поле email пользовательской модели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...