使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

Posted

技术标签:

【中文标题】使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权【英文标题】:Authentication and Authorization with Django GraphQL JWT and Graphene Relay 【发布时间】:2020-04-14 13:04:40 【问题描述】:

我想问一下如何使用 Graphen Relay 和 Django JWT 对特定用户(所有者)进行身份验证和查询标签。 这是我的模型:

class Tag(models.Model):
"""Tag to be used for a objective"""
name = models.CharField(max_length=255)
user = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    related_name='tag',
    on_delete=models.CASCADE,
)

这是我的架构代码:

class TagNode(DjangoObjectType):
class Meta:
    model = Tag
    filter_fields = ['name']
    interfaces = (relay.Node,)

这是我的查询:

class Query(graphene.ObjectType):
    tag = relay.Node.Field(TagNode)
    all_tags = DjangoFilterConnectionField(TagNode)

    def resolve_all_tags(self, info):

        # context will reference to the Django request
        print(info.context.user)
        if not info.context.user.is_authenticated:
            return Tag.objects.none()
        else:
            return Tag.objects.filter(user=info.context.user)

这是 Django JWT 的文档:https://github.com/flavors/django-graphql-jwt 但我不知道如何获取用户(已经使用 info.context.user)但它不起作用, 当我尝试在标头中添加授权(JWT 令牌)或作为参数时。它也不起作用。

【问题讨论】:

【参考方案1】:

基本上你做的一切都是正确的,你的用户应该被成功获取。 我刚刚检查过,它适用于我的情况,我像使用 cookie 一样使用 JWT,但这没关系。

您在尝试获取标签时是否授权您的用户? 因为关于 JWT,您需要授权您的用户并接收 JWT 令牌。只有在那之后,当您调用标签查询时,才会在请求中显示真实用户。否则用户将是匿名的。

【讨论】:

以上是关于使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权的主要内容,如果未能解决你的问题,请参考以下文章

django-graphql-jwt JWT_COOKIE_SAMESITE 不工作

JWT 身份验证:使用 UI 令牌对 Graphene/Django (GraphQL) 查询进行身份验证?

使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

基于类的视图django中的JWT验证

忘记了 django 和 graphql 的密码?

GraphQL - JWT - 更改 verifyToken 突变的有效负载 - django