如何自定义django jwt graphql身份验证

时间:2020-03-14 19:14:47

标签: django graphql jwt

嗨,我正在尝试自定义

jwt graphql Django默认身份验证

我需要使用用户名或电子邮件登录

常规Django,我们定制了身份验证后端。

mutation{
  tokenAuth(username:"myemail@email.com"
  password:"pass")
  {
    token
  }
}

使用用户名验证

mutation{
  tokenAuth(username:"myname"
  password:"pass")
  {
    token
  }
}

正常的用户名运行正常。

我如何通过jwt graphql中的用户名或电子邮件对用户进行身份验证

我尝试了此链接

https://django-graphql-jwt.domake.io/en/latest/customizing.html

我对此一无所知...

有人对此有任何想法吗?

2 个答案:

答案 0 :(得分:0)

您必须在Model级别上进行更改,而不是在JWT中进行更改,因为JWT只是幕后发生的事情的呈现,因此JWT将紧随其后。

查看下面的链接,也许会对您有所帮助! :)

Multiple USERNAME_FIELD in django user model

答案 1 :(得分:0)

免责声明-妈妈的回答应该起作用。在写答案的一半时,我意识到我错了,但我仍然想向您展示我想提出的建议。它显示了JWT TokenAuth突变的作用以及完全利用该突变的方法。

  1. 按照妈妈的回答建议更改内置Django身份验证
  2. 重写graphql_jwt.decorators.token_auth以查看两个字段,而不仅仅是一个字段
  3. 为在mutate函数上使用此装饰器的TokenMutation编写自己的类

类似的东西(未经测试):

def two_field_token_auth(f):
    @wraps(f)
    @setup_jwt_cookie
    @csrf_rotation
    @refresh_expiration
    def wrapper(cls, root, info, password, **kwargs):
        context = info.context
        context._jwt_token_auth = True
        username = kwargs.get('username')
        email = kwargs.get('email')

        user = your_auth_method(
            request=context,
            username=username,
            email=email,
            password=password,
        )
        if user is None:
            raise exceptions.JSONWebTokenError(
                _('Please enter valid credentials'),
            )

        if hasattr(context, 'user'):
            context.user = user

        result = f(cls, root, info, **kwargs)
        signals.token_issued.send(sender=cls, request=context, user=user)
        return maybe_thenable((context, user, result), on_token_auth_resolve)
    return wrapper

class TwoFieldJWTMutation(JSONWebTokenMutation):
    @classmethod
    @two_field_token_auth
    def mutate(cls, root, info, **kwargs):
        return cls.resolve(root, info, **kwargs)

您可以找到herehere

的所有必需的导入内容