Я использую 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, когда это уместно?