поместите токен JWT в заголовок для клиента Apollo

#javascript #reactjs #graphql #jwt #apollo

#javascript #reactjs #graphql #jwt #apollo

Вопрос:

В настоящее время, если я запускаю мутации graphql из своего приложения react, они не работают, потому что токен авторизации отсутствует в заголовке. У меня есть секрет администратора, который я хочу вставить в заголовок, но я не уверен, как это сделать.

 import { ApolloClient } from 'apollo-client';
import { InMemoryCache, NormalizedCacheObject } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import { ApolloProvider } from '@apollo/react-hooks';
....
const cache = new InMemoryCache();
const link = new HttpLink({
  uri: 'https://api/graphql',
});

const client: ApolloClient<NormalizedCacheObject> = new ApolloClient({
  cache,
  link,
});
ReactDOM.render(
  <ThemeProvider theme={theme}>
    <CssBaseline />
    <ApolloProvider client={client}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </ApolloProvider>
  </ThemeProvider>,
  document.querySelector('#root'),
);
  

У меня также есть это в моем Apollo.config.js файл:

 module.exports = {
    client: {
      service: {
        url: 'https://api/graphql',
        headers: {
          'x-hasura-admin-secret': 'xxx',
        },
      },
      excludes: ['src/graphql/index.tsx'],
    },
  };
  

Как я могу включить токен в заголовок? Это было бы что-то вроде этого:

 'Authorization', `Bearer ${token}
  

Тот же API использовался и в другом проекте React Native, и они получили токен следующим образом:

 import auth from '@react-native-firebase/auth';
...
const token = await auth().currentUser?.getIdToken();
  

Но я не понимаю, как добиться этого в react.

Я также пробовал это так:

 import { createHttpLink, InMemoryCache, ApolloClient } from '@apollo/client';
import { setContext } from '@apollo/client/link/context';

const httpLink = createHttpLink({
  uri: 'https://graphql',
});

const authLink = setContext((_, { headers }) => {
  const token = 'XX';
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : "",
    }
  }
});

const client = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
});
  

Но я получаю сообщение об ошибке здесь:

 <ApolloProvider client={client}>
  

это:

 Type 'ApolloClient<NormalizedCacheObject>' is missing the following properties from type 'ApolloClient<any>': store, writeData, initQueryManager
  

Комментарии:

1. apollographql.com/docs/react/networking/authentication

2. Я пробовал это, но это выдает меня Type 'ApolloClient<NormalizedCacheObject>' is missing the following properties from type 'ApolloClient<any>': store, writeData, initQueryManager на клиенте <ApolloProvider client={client}> . В любом случае, будет admin secret ли здесь использоваться как токен? @DanielA. Белый

Ответ №1:

В зависимости от того, где ваш токен хранится на клиенте, вы можете попробовать это

 
const authLink = setContext((_, { headers }) => {
  const token = localStorage.getItem("id");
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : "",
    },
  };
});

  

Комментарии:

1. Это импорт, который я использовал, чтобы заставить его работать import { ApolloClient, createHttpLink, InMemoryCache } from "@apollo/client"; import { setContext } from "@apollo/client/link/context";

2. Из вашего сообщения выше похоже, что мы использовали разные пакеты, у меня были проблемы с моим api, когда я начал с импорта, который вы также используете. @Apollo имеет несколько папок, к которым можно получить доступ.

3. Да, я прокомментировал свой и сделал это так, как вы предложили, с тем же импортом, но все равно получаю эту ошибку. Странно. Знаете ли вы, какие версии вы используете?

4. 4.0.0 Да, это странно. Вот ссылка на мой файл Apollo, возможно, это поможет немного больше. codepen.io/niles87/pen/KKzLgWb

5. До этой части я тоже не получаю сообщение об ошибке. Я получаю ошибку только при <ApolloProvider client={client}> первом клиентском слове. Это в возвращаемой части кода из вопроса