如何自定义 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 中使用自定义注册突变