因此,我正在尝试将auth0与现有的django应用程序和sqlite数据库集成。登录正常,问题是我无法通过请求获取auth0输入的用户名以映射到数据库中已存在的用户模型。
这是auth0后端,现在我已硬编码分别为用户名和user_id返回eq3和21。
def get_user_details(self, response):
# Obtain JWT and the keys to validate the signature
id_token = response.get('id_token')
jwks = request.urlopen('https://' + self.setting('DOMAIN') + '/.well-known/jwks.json')
issuer = 'https://' + self.setting('DOMAIN') + '/'
audience = self.setting('KEY') # CLIENT_ID
payload = jwt.decode(id_token, jwks.read(), algorithms=['RS256'], audience=audience, issuer=issuer)
return {'username': 'eq3',
'user_id': 21}
但是,当我转到views.py并分别放置print(request.user.username)
和print(request.user.id)
时,它会打印eq306fa23456g204e8c
和51
。当我进入数据库时,我看到它确实在auth_user表中创建了一个新用户,即使在同一表中已经有一个eq3和id为21的用户。此外,如果我输入一个随机的用户名,例如foobar
,它仍然会创建一个新用户,但不会将无意义的字母数字字符串添加到用户名中,而只是添加foobar
。这里发生了什么?如何让django识别出用户名eq3已经存在于数据库中,并以此作为用户来检索应用程序数据的用户?
答案 0 :(得分:0)
这是由于我没有在settings.py中设置python-social-auth管道,我需要在auth_user
表中添加电子邮件列,并使用以下内容覆盖默认设置:
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.social_auth.associate_by_email', #this was the important one
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
)