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

Posted

技术标签:

【中文标题】如何自定义 django jwt graphql 身份验证【英文标题】:how to customize django jwt graphql authentication 【发布时间】:2020-06-26 09:53:46 【问题描述】:

您好,我正在尝试自定义

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

我对此一无所知...

有人知道吗?

【问题讨论】:

【参考方案1】:

您必须在模型级别而不是在 JWT 中进行更改,JWT 将随之而来,因为 JWT 只是对幕后发生的事情的呈现。

看看下面的链接,也许对你有帮助! :)

Multiple USERNAME_FIELD in django user model

【讨论】:

这无济于事,因为 JWT 的 token_auth 专门针对 USERNAME_FIELD 在这里查看:github.com/flavors/django-graphql-jwt/blob/master/graphql_jwt/… 我错了,token_auth 然后调用 Django 的authenticate,所以如果你以链接中建议的方式覆盖它(用户名 arg 也接受电子邮件)你很好【参考方案2】:

免责声明 - 妈妈的回答应该有效。写到一半时我意识到我错了,但我仍然想向您展示我想要建议的内容。它展示了 JWT TokenAuth 变异的作用以及完全利用它的方法。

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

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

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)

您可以找到所有必要的导入 here 和 here

【讨论】:

以上是关于如何自定义 django jwt graphql 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

NestJS:如何在从 JWT AuthGuard 扩展的 GraphQL 自定义 Guard 中从请求中获取用户

如何结合突变在 django-graphql-jwt 中创建或登录用户?

DJANGO-GRAPHQL-JWT:我们如何知道刷新令牌发布后的年龄?

如何在 django-graphql-auth 中使用自定义注册突变

JWT:如何在密码或用户名错误 Django REST 上实现我的自定义错误消息

如何使用访问和刷新令牌返回自定义数据以识别 Django Rest Framework 简单 JWT 中的用户?