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 的源代码来理解这个问题。
其实这里有两个问题:
- 使用 linkedin_oauth2 的正确配置是什么?完整配置包括 login.html、INSTALLED_APPS 和 SOCIALACCOUNT_PROVIDERS.
- 为什么
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 解决了这个问题。
所有其他配置都会导致登录失败(SERVER 500 ERROR)。经过十几种不同组合的排列,唯一登录成功但仍然遗漏extra_data字段的配置如下。缺少的字段可以是 'skills'、'summary' 来自 'r_basicprofile' 范围。
我是不是遗漏了一些进口信息?如果您发现它,请告诉我。我一直在阅读 django-allauth 的源代码来理解这个问题。
其实这里有两个问题:
- 使用 linkedin_oauth2 的正确配置是什么?完整配置包括 login.html、INSTALLED_APPS 和 SOCIALACCOUNT_PROVIDERS.
- 为什么
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_auth2INSTALLED_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 解决了这个问题。