如何在django中使用allauth从Linkedin获取emailAddress?

时间:2019-03-25 20:52:23

标签: python django oauth-2.0 linkedin django-allauth

我想使用Linkedin注册用户,以检索他们的姓名,姓氏和电子邮件。为此,我在Django上使用allauth。我可以注册名字和姓氏,但不能自动保存数据中的电子邮件。

在首页›社交帐户›社交帐户›“ the_user”关于额外数据:{“ elements”:[{“ handle”:“ urn:li:emailAddress:152954186”,“ handle〜”:{“ emailAddress” :“ example@example.com”}}],“名字”:{...。我可以看到该代码确实检索了电子邮件,但没有存储它。

从auth_user;(从数据库)中选择select *或在Home› Authentication and Authorization› Users中,我发现该代码不会自动存储电子邮件。我想代码会检索名字和姓氏,因为这些项不在数组内。

我的Linkedin应用程序具有r_emailaddress,r_liteprofile和w_member_social权限,并且我正在使用OAuth 2.0。

在settings.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 :(得分:0)

Allauth通过EmailAddress对象为一个用户存储多封电子邮件,该对象包括一个verified字段和一个primary字段。保存为主要电子邮件的Allauth EmailAddress对象将在{时自动将电子邮件地址复制到user model(在您的情况下为email)的auth_user字段中。 {1}}对象已保存。因此,您可以执行以下操作:

EmailAddress

from allauth.account.models import EmailAddress 电子邮件地址_来自_链接_in email, created = EmailAddress.objects.get_or_create(user=request.user, email=

, verified=True, primary=True)

同样,关键是将if not created: email.primary = True email.save() 上的primary设置为EmailAddress,以便将电子邮件地址自动复制到{{3 }}。

答案 1 :(得分:0)

我没有适当检查情况。我尝试存储的电子邮件已经在 account_emailaddress 上进行了注册,该表在email列上具有唯一的约束,因此我无法从其他socialaccount_socialaccount保存该电子邮件(用于存储已注册用户的表来自社交网络)。从account_emailaddress删除条目可以解决该问题。

此后,我立即在/ accounts / linkedin_oauth2 / login / callback /处收到ConnectionRefusedError,该错误通过在settings.py上进行编码来解决

ACCOUNT_EMAIL_VERIFICATION = 'none'

https://github.com/pennersr/django-allauth/issues/1740那边的状态。