Как я могу использовать ApolloClient для передачи заголовков авторизации fre sh на сервер при использовании Firebase Admin SDK? - PullRequest
1 голос
/ 29 апреля 2020

Я использую Firebase Admin SDK для своего сервера - в моем случае Apollo Server работает в облачных функциях Google. При входе в систему сервер генерирует токен и возвращает его клиенту. Клиент помещает его в локальное хранилище и использует для будущих запросов. Это работает нормально, пока токен не истечет 1 час спустя.

Как я могу обновить sh токен, чтобы пользователю не нужно было продолжать входить в систему каждый час?

На сервере , логин возвращает токен; клиент поместит его в локальное хранилище

exports.login = async (email, password) => {
    const data = await firebase
        .auth()
        .signInWithEmailAndPassword(email, password);

    const token = await data.user.getIdToken();
    return token;
}

На клиенте ApolloClient включает токен с заголовками аутентификации

В этом примере я использую Gatsby, но у меня было то же самое проблема в том, чтобы сделать это с помощью create-реакции-приложения.

import fetch from 'isomorphic-fetch';
import {ApolloClient, HttpLink, InMemoryCache} from '@apollo/client';
import {setContext} from 'apollo-link-context';

const httpLink = new HttpLink({
  uri: `${process.env.GATSBY_API_URL}`,
  fetch,
});

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

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

Одним из возможных решений может быть, если бы я не использовал Graphql и ApolloClient, чтобы импортировать firebase.auth на клиенте и генерировать обновленный токен аутентификации перед каждый запрос. Например:

// firebase_service.js
import * as firebase from 'firebase/app';
import 'firebase/auth';
import { config } from './firebase-config';

firebase.initializeApp(config);

export const auth = firebase.auth;

// getData.js
import { auth } from '../firebase_service';
import axios from 'axios';

const getData = () => {
    const token = await auth().currentUser.getIdToken(true);
    return axios
      .get(FIREBASE_API_URL, {
        headers: { authorization: `Bearer ${token}` },
      })
      .then((res) => res.data);
}

Есть ли способ сделать что-то подобное, но с ApolloClient, чтобы заголовки включали токен fre sh, когда это уместно?

...