oauth-2.0 如何在django中使用allauth从Linkedin获取电子邮件地址?

jbose2ul  于 2022-10-31  发布在  Go
关注(0)|答案(3)|浏览(126)

我想注册用户使用Linkedin,以检索他们的名字,姓氏和电子邮件。为此,我使用allauth在django上。我可以注册的名字和姓氏,但我不能自动保存电子邮件的数据。
查看主页›社交帐户›社交帐户›“the_user”on额外数据:{“要素”:[{“处理”:“urn:li:emailAddress:152954186”,“处理~":{“电子邮件地址”:“example@example.com“}}],“名字”:{....我可以看到代码确实检索了电子邮件,但它没有存储它。
签入来自auth_user的select *;(从数据库)或在Home › Authentication and Authorization › Users中,我看到代码没有自动存储电子邮件。我认为代码检索的是名字和姓氏,因为这些项不在数组中。
我的linkedin应用程序有r_emailaddress、r_liteprofile和w_member_social权限,我使用的是OAuth 2.0。
在www.example.com上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应用程序的www.example.com上

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

我想要的是代码自动存储的电子邮件项在auth_user.email列。我可以这样做与数据库上的触发器,但它不觉得正确的执行方式。
请帮助我成功地存储数据的Django的方式

r6vfmomb

r6vfmomb1#

我没有正确检查情况。我试图存储的电子邮件已经在account_emailaddress上注册,该表对电子邮件列有唯一约束,因此我无法从其他socialaccount_socialaccount(用于存储社交网络中的注册用户的表)中保存相同的电子邮件。删除account_emailaddress中的条目解决了该问题。
紧接着,我在/accounts/linkedin_oauth2/login/callback/上遇到了一个ConnectionRefusedError,这个错误通过在www.example.com上编写代码得到了解决settings.py

ACCOUNT_EMAIL_VERIFICATION = 'none'

就像上面说的https://github.com/pennersr/django-allauth/issues/1740

tf7tbtn2

tf7tbtn22#

Allauth通过EmailAddress对象为单个用户提供了存储多封电子邮件的功能,其中包含一个verified字段和一个primary字段。保存为主电子邮件的Allauth EmailAddress对象将自动将电子邮件地址复制到用户模型上的email字段中(在您的例子中是auth_user)。因此,您可以执行类似以下的操作:
from allauth.account.models import EmailAddress
email, created = EmailAddress.objects.get_or_create(user=request.user, email= * 链接来源的电子邮件地址 * , verified=True, primary=True)

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

同样,关键是将EmailAddress上的primary设置为True,以便将电子邮件地址自动复制到用户模型的email字段中。

vecaoik1

vecaoik13#

我在获取电子邮件时遇到了问题,并通过删除所有配置文件字段并将SOCIALACCOUNT_QUERY_EMAIL设置为True来解决此问题。现在,它们正确保存在用户数据中

SOCIALACCOUNT_PROVIDERS = {
    'linkedin_oauth2': {
        'SCOPE': [
            'r_liteprofile',
            'r_emailaddress',
        ],
        'PROFILE_FIELDS': []
    }
}
SOCIALACCOUNT_QUERY_EMAIL = True

相关问题