extra_data 中的 Django-allauth Linkedin OAUTH2.0 缺失字段

Django-allauth Linkedin OAUTH2.0 Missing Fields in extra_data

所有其他配置都会导致登录失败(SERVER 500 ERROR)。经过十几种不同组合的排列,唯一登录成功但仍然遗漏extra_data字段的配置如下。缺少的字段可以是 'skills'、'summary' 来自 'r_basicprofile' 范围。

我是不是遗漏了一些进口信息?如果您发现它,请告诉我。我一直在阅读 django-allauth 的源代码来理解这个问题。

其实这里有两个问题:

  1. 使用 linkedin_oauth2 的正确配置是什么?完整配置包括 login.html、INSTALLED_APPS 和 SOCIALACCOUNT_PROVIDERS.
  2. 为什么 PROFILE_FIELDS 中指定的字段未填充到 extra_data 中?

我的 Linkedin 社交登录应用是最近创建的。那么,它使用的是 OAuth2.0 而不是 OAuth1.0,对吗?我遵循了文档 https://django-allauth.readthedocs.org/en/latest/providers.html?highlight=provider_login_url#linkedin 上的说明 'Leave the OAuth redirect URL empty.'

仍然缺少字段但启用登录成功的配置: 在模板 login.html 中,使用 'linkedin'

  <a href="{% provider_login_url 'linkedin' %}" class="btn btn-block btn-social btn-linkedin">

在settings.py中,在INSTALLED_APPS中使用'linkedin',在SOCIALACCOUNT_PROVIDERS中使用'linkedin_oauth2'。

我没有把 { 'r_contactinfo', 'r_network'} 放在 'SCOPE' 中,因为它需要 'Apply with Linkedin' 程序申请和批准。

INSTALLED_APPS=(
    ...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    #providers
    'allauth.socialaccount.providers.linkedin',
  ....
 )


SOCIALACCOUNT_PROVIDERS = \
    {'linkedin_oauth2':
          {'SCOPE': ['r_emailaddress', 'r_basicprofile'],
           'PROFILE_FIELDS': ['id',
                             'first-name',
                             'last-name',
                             'email-address',
                             'picture-url',
                             'picture-urls::(original)', # picture-urls::(original) is higher resolution
                             'public-profile-url',
                             'skills',
                             'headline'
                             'location',
                             'industry',
                             ]}
    }

所有失败的配置如下。 在 INSTALLED_APPS 中仅使用 linkedin_oauth2。在SOCIALACCOUNT_PROVIDERS

中仍然使用linkedin_auth2
INSTALLED_APPS=(
    ...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    #providers
    'allauth.socialaccount.providers.linkedin_oauth2',
  ....
 )

login.html可以

在我的调试日志消息中,这是典型的错误。

provider_login_url 中使用 linkedin_oauth2 导致

ERROR 13/Dec/2015 19:22:48 base 1217 139681546774272  [django.request:256] Internal Server Error: /accounts/linkedin_oauth2/login/
Traceback (most recent call last):
  File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/providers/oauth2/views.py", line 55, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/providers/oauth2/views.py", line 78, in dispatch
    app = provider.get_app(self.request)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/providers/base.py", line 38, in get_app
    return SocialApp.objects.get_current(self.id, request)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/models.py", line 31, in get_current
    provider=provider)
  File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/query.py", line 334, in get
    self.model._meta.object_name
allauth.socialaccount.models.DoesNotExist: SocialApp matching query does not exist.

或 如果INSTALLED_APPS中只包含linkedin_oauth2,在provider_login_url中使用linkedin会导致这个

  File "/opt/python/run/venv/lib/python3.4/site-packages/django/template/defaulttags.py", line 329, in render
    return nodelist.render(context)
  File "/opt/python/run/venv/lib/python3.4/site-packages/django/template/base.py", line 903, in render
    bit = self.render_node(node, context)
  File "/opt/python/run/venv/lib/python3.4/site-packages/django/template/base.py", line 917, in render_node
    return node.render(context)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/templatetags/socialaccount.py", line 17, in render
    provider = providers.registry.by_id(provider_id)
  File "/opt/python/run/venv/lib/python3.4/site-packages/allauth/socialaccount/providers/__init__.py", line 20, in by_id
    return self.provider_map[id]
KeyError: 'linkedin'

你必须使用 "linkedin_oauth2" 而不是 "linkedin"。

href="{% provider_login_url 'linkedin_oauth2' %}" class="btn btn-block btn-social btn-linkedin"

这将对可能 运行 解决此问题的其他人有所帮助。我通过更改在 Linkedin OAuth2 的 api 手册中更新的 LinkedOAuth2 的 token_url 解决了这个问题。