如何在 graphene-django GraphQLTestCase 中使用 django-grahql-jwt 进行身份验证?

Posted

技术标签:

【中文标题】如何在 graphene-django GraphQLTestCase 中使用 django-grahql-jwt 进行身份验证?【英文标题】:How to authenticate with django-grahql-jwt in a graphene-django GraphQLTestCase? 【发布时间】:2020-10-03 05:25:33 【问题描述】:

我正在尝试根据石墨烯 django 文档测试我的突变。突变适用于@login_required 装饰器,并且存在问题,因为任何登录测试方法都不起作用。我试过self.client.loginself.client.force_login。我什至做了一个 tokenAuth 突变,并在那里硬编码了一些凭据,但它也不起作用;用户仍然是匿名的。

def test_create_member_mutation(self):
    response = self.query(
        '''
        mutation createMember($firstName: String) 
            createMember(firstName: $firstName) 
                member 
                    id
                
            
        
        ''',
        op_name='createMember',
        variables='firstName': 'Foo'
    )

    self.assertResponseNoErrors(response)

【问题讨论】:

你是用django的session认证还是graphql JWT? @ruohola 抱歉,没有具体说明。 graphql jwt 那么你很幸运,我也遇到了同样的问题。 【参考方案1】:

这就是我在测试中解决它的方法。

您可以在self.query()headers 关键字参数中传递为测试用户制作的令牌:

from django.contrib.auth import get_user_model
from graphene_django.utils import GraphQLTestCase
from graphql_jwt.shortcuts import get_token


class ExampleTests(GraphQLTestCase):

    def test_create_member_mutation(self):
        user = get_user_model().objects.get(pk=1)
        token = get_token(user)
        headers = "HTTP_AUTHORIZATION": f"JWT token"

        graphql = '''
            mutation createMember($firstName: String) 
                createMember(firstName: $firstName) 
                    member 
                        id
                    
                
            
        '''

        respsone = self.query(
            graphql,
            op_name='createMember',
            variables='firstName': 'Foo',
            headers=headers,
        )
        self.assertResponseNoErrors(response)

【讨论】:

我得到:TypeError: query() got an unexpected keyword argument 'headers',您安装了哪些版本的graphql 和graphene?我阅读了所有的源代码,发现只有**extra,没有提到标题。 @EmacsTheViking 参数好像还在:github.com/graphql-python/graphene-django/blob/… 谢谢!我不知道为什么我之前没有检查版本。我有 2.7.1,现在已经很旧了,我加入了这个项目,它是很久以前创建的......我会升级。谢谢。

以上是关于如何在 graphene-django GraphQLTestCase 中使用 django-grahql-jwt 进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react 中使用 graphene-django 和 axios 将图像上传到我的服务器?

Graphene-Django - 如何将参数从 Query 传递到类 DjangoObjectType

如何查看graphene-django DEBUG日志

如何使用 graphene-django 定义突变的自定义输出类型?

graphene-django 中的自定义参数

如何配置 Graphene-Django 以处理持久查询?