Django身份验证不必要地创建了新用户-auth0要地、新用户、身份验证、Django

2023-09-03 12:29:05 作者:囍

因此,我正在尝试将auth0与我现有的Django应用程序和SQLite数据库集成。登录工作正常,问题是我无法通过请求映射到我的数据库中已存在的用户模型来获取Auth0输入的用户名。

这是auth0后端,现在我已经硬编码为用户名和用户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)时,它会打印eq306fa23456g204e8c51。当我进入我的数据库时,我看到它确实在auth_user表中创建了一个新用户,尽管在同一个表中已经有一个具有EQ3和用户id 21的用户。此外,如果我输入一个随机的用户名,比如foobar,它仍然会创建一个新用户,但它不会将毫无意义的字母数字字符串添加到用户名中,而只是foobar。这里发生什么事情?如何让Django识别用户名EQ3已在数据库中,从而将其用作从中检索应用数据的用户?

推荐答案

django 设置媒体url Django用户身份验证示例

这是因为我没有在settings.py中设置python-Social-auth管道。py我需要在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',
)