React Context - это предоставление некоторых данных одному или нескольким дочерним компонентам без необходимости передачи данных через промежуточные компоненты. Нет встроенного механизма для сохранения состояния между загрузками страниц, поэтому вам нужно найти другой инструмент для этого.
Если вы еще не внедрили свой уровень аутентификации, вам нужно посмотреть, как это будет работать. Существует несколько стратегий для поддержания этого состояния, даже при использовании хранилища на основе файлов cookie. JWT (JSON Web Token) - это популярный метод, который позволяет хранить подписанные пользовательские и клиентские данные в cookie-файлах, требуя немного больше работы для управления истечением / обновлением и большей полезной нагрузкой. Предполагая, что вы выбрали именно такой подход, вы можете сделать что-то вроде этого:
import React from "react";
import jwt from "jsonwebtoken"; // Add jsonwebtoken via npm/yarn
function getCookieValue(a) {
var b = document.cookie.match('(^|[^;]+)\\s*' + a + '\\s*=\\s*([^;]+)');
return b ? b.pop() : '';
}
const AUTH_PUBLIC_KEY = "your JWT public key here"
export const AuthContext = React.createContext();
export class AuthContextProvider extends React.Component {
state = {
authenticated: false,
userid: null,
};
componentDidMount() {
jwt.verify(getCookieValue("session"), AUTH_PUBLIC_KEY, (err, session) => {
if (!err && session.userid) {
this.setState({ userid: session.userid, authenticated: true })
}
})
}
// Important: REMOVE THIS AFTER TESTING/DEV
toggleLogin = () => {
this.setState(state => ({
authenticated: !state.authenticated,
userid: 2,
}));
}
render() {
return (
<AuthContext.Provider
value={{
...this.state,
toggleLogin: this.toggleLogin,
}}
>
{this.props.children}
</AuthContext.Provider>
);
}
}
Это позволит проанализировать токен JWT в файле cookie session
при монтировании AuthContextProvider и обновить состояние, указав значение userid
, сохраненное в JWT, если оно есть.
Возможно, вы захотите обернуть Gatsby App
этим компонентом, что вы можете сделать из файлов gatsby-browser.js
и gatsby-ssr.js
(создайте их в корне репозитория, если у вас их еще нет):
// gatsby-browser.js
import React from "react"
import AuthContextProvider from "components/AuthContextProvider"
export const wrapRootElement = ({ element }) =>
<AuthContextProvider>{element}</AuthContextProvider>
// gatsby-ssr.js
import React from "react"
export { wrapRootElement } from "./gatsby-browser"
Вам все еще нужно будет обработать генерирование токена JWT (возможно, из бэкэнда, который обрабатывает аутентификацию), и, если он еще не сохранен в cookie, вы можете получить доступ из браузера, вам нужно будет обработать создание этого cookie в соответствующий момент в жизненном цикле вашего приложения.