Графен-Django не отправляет файл cookie HttpOnly JWT для реакции-Apollo

#cookies #graphql #jwt #apollo #httponly

Вопрос:

Привет, я создавал приложение с использованием Django и Graphene для GraphQL сервера, к которому будет обращаться React клиент, использующий Apollo . Я использую graphql_jwt для аутентификации.

Я настроил свой сервер GraphQL и клиентский код для чтения JWT, но я узнал, что localStorage недостаточно безопасен и не является файлом cookie. Мне удалось найти способ установить файл cookie HttpOnly при выполнении запроса tokenAuth, и файл cookie сохраняется и функционирует в GraphiQL (локальный хост:8000).

Набор файлов cookie JWT HHTPOnly

Мне удалось сделать это с jwt_cookie помощью декоратора из graphql_jwt.decorators

 from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from django.views.decorators.csrf import csrf_exempt
from graphql_jwt.decorators import jwt_cookie

urlpatterns = [
    path('admin/', admin.site.urls),
    path('graphql/', jwt_cookie(csrf_exempt(GraphQLView.as_view(graphiql=True))))
]
 

К сожалению, когда я вызываю конечную точку tokenAuth из Apollo (localhost:3000), она не устанавливает файл cookie и не может получить доступ к нему из моего программного обеспечения (теперь, когда я думаю об этом, это имеет смысл). same-origin Ни include учетные данные или не работают ни на сервере HttpLink , ни на ApolloClient нем самом.

 import { 
  ApolloClient, 
  gql, 
  ApolloProvider, 
  HttpLink, 
  from,
  useQuery,
  ApolloLink
} from '@apollo/client';
import { onError } from '@apollo/client/link/error';
import { setContext } from 'apollo-link-context';

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    graphQLErrors.forEach(({ message }) => {
      console.log(message);
    });
  }
  if (networkError) {
    console.log(networkError.message)
  }
});
const afterwareLink = new ApolloLink((operation, forward) => {
  return forward(operation).map(response => {
    const context = operation.getContext();
    const { response: { headers } } = context;
    console.log(headers);
    return response;
  });
});


const link = from([
  errorLink,
  setContext((operation) => {
    console.log("HITTING SET CONTEXT");
    // const token = localStorage.getItem('authToken');
    const token = Cookies.get('authToken');
    console.log(token);
    return {
      headers: {
        Authorization: token ? `JWT ${token}` : ''
      }
    }
  }),
  afterwareLink,
  new HttpLink({ uri: 'http://localhost:8000/graphql/' })
]);

const client = new ApolloClient({
  link,
  cache,
  typeDefs,
  credentials: 'include'
});
 

Пожалуйста refreshToken , игнорируйте значения authToken и. Я положил их вместе с js-cookie пакетом. Но, как вы можете видеть, заголовки пусты и не были установлены при входе в систему на клиенте, но они были на сервере.

введите описание изображения здесь

вопрос:

Как передать заголовки ответов jwt на интерфейс?

Ответ №1:

ТАК что я смог решить эту проблему. Я опубликовал свое решение на Github

https://github.com/flavors/django-graphql-jwt/issues/191