#cookies #graphql #jwt #apollo #httponly
Вопрос:
Привет, я создавал приложение с использованием Django
и Graphene
для GraphQL
сервера, к которому будет обращаться React
клиент, использующий Apollo
. Я использую graphql_jwt
для аутентификации.
Я настроил свой сервер GraphQL и клиентский код для чтения JWT, но я узнал, что localStorage недостаточно безопасен и не является файлом cookie. Мне удалось найти способ установить файл cookie HttpOnly при выполнении запроса tokenAuth, и файл cookie сохраняется и функционирует в GraphiQL (локальный хост:8000).
Мне удалось сделать это с 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