Django graphql JWT аутентификация дает анонимному пользователю, хотя действительный токен предоставляется [ответил] - PullRequest
1 голос
/ 13 апреля 2020

Я следую этому руководству по аутентификации с django -graphql-jwt. У меня не получается выполнить шаг Проверка аутентификации.

Я получаю действительный токен через ObtainJSONWebToken, но когда я вставляю этот токен в авторизацию заголовка HTTP и выполняю запрос ( me ), который проверяет статус пользователя дает анонимный пользователь.

Когда я захожу на страницу администрирования django, он работает без токена. Кажется, что промежуточное ПО не работает должным образом, но это всего лишь предположение.

Вот мой код и то, что я делаю:

settings.py:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

GRAPHENE = {
    'SCHEMA': 'schema.py',
    'MIDDLEWARE': [
        'graphql_jwt.middleware.JSONWebTokenMiddleware'
    ]
}

schema.py

class Query(teamorgaisation_queries.Query, users_queries.Query, graphene.ObjectType):
    # this class inherits multiple Queries as we add more apps with their own schema
    pass


class Mutation(teamorganisation_mutations.Mutation, users_mutations.Mutation, graphene.ObjectType):
    token_auth = graphql_jwt.ObtainJSONWebToken.Field()
    verify_token = graphql_jwt.Verify.Field()
    refresh_token = graphql_jwt.Refresh.Field()

me-query

import graphene
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist

from voss_be_django.users.graphql.types import UserType


class Query(graphene.ObjectType):

    me = graphene.Field(UserType)

    def resolve_me(self, info):
        user = info.context.user
        if user.is_anonymous:
            raise Exception('Not logged in!')
        return user

Почтальон запрос без заголовка авторизации:

mutation tokenAuth($username: String!, $password: String!){
    tokenAuth(username: $username, password: $password){
        token
    }
}

переменные:

{
    "username": "testUser",
    "password": "UserTest#1234"
}

ответ (внутри <> есть действительный токен):

{
    "data": {
        "tokenAuth": {
            "token": "<my_jwt_token>"
        }
    }
}

Затем я вставляю токен в заголовок:

{
    Authorization: "JWT <my_jwt_token>",
    Content-Type: "application/json"
}

query:

query me {
    me{
        id
        username
    }
}

ответ:

{
    "errors": [
        {
            "message": "Not logged in!",
            "locations": [
                {
                    "line": 2,
                    "column": 5
                }
            ],
            "path": [
                "me"
            ]
        }
    ],
    "data": {
        "me": null
    }
}

info.context.user, полученный в запросе me, является anonymousUser, но я ожидаю, что это обычный пользователь , Что я делаю не так?

1 Ответ

0 голосов
/ 13 апреля 2020

Хорошо, я нашел свою ошибку:

Я ошибочно удалил подписку из своего settings.py

AUTHENTICATION_BACKENDS = [
    'graphql_jwt.backends.JSONWebTokenBackend',
    'django.contrib.auth.backends.ModelBackend',
]

В этом учебнике используется устаревший стиль для реализации промежуточного программного обеспечения, поэтому я подумал, что мне также нужно удалить эту часть. Но я был не прав.

...