#apollo-client #auth0 #react-admin #hasura
Вопрос:
В этом примере показано, как использовать Auth0 с react-admin
. Он работает так, как и ожидалось. Мы пытаемся настроить его таким образом, чтобы он использовал поставщика данных hasura. Мы создали новый файл dataProvider.js
, который создаст поставщика данных:
import buildHasuraProvider from "ra-data-hasura";
import { ApolloClient, InMemoryCache } from "@apollo/client";
export const initDataProvider = async (token) => {
const client = new ApolloClient({
uri: process.env.REACT_APP_GRAPHQL_URI,
headers: {
Authorization: `Bearer ${token}`,
},
cache: new InMemoryCache(),
});
const dataProvider = await buildHasuraProvider({ client });
return dataProvider;
};
Однако нам не хватает токена JWT, который создается в рамках процесса аутентификации Auth0. Мы не знаем, как получить токен, чтобы инициализировать с его помощью поставщика данных. Знает ли react-admin, как это сделать самостоятельно? если нет, то как нам получить доступ к токену JWT, чтобы сделать это самостоятельно вручную?
Это authProvider
исходный код:
import authConfig from "./authConfig";
import {Auth0Client} from '@auth0/auth0-spa-js';
const auth0 = new Auth0Client({
domain: authConfig.domain,
client_id: authConfig.clientID,
redirect_uri: authConfig.redirectURI,
cacheLocation: 'localstorage',
useRefreshTokens: true
});
export default {
// called when the user attempts to log in
login: (url) => {
if (typeof url === 'undefined') {
return auth0.loginWithRedirect()
}
return auth0.handleRedirectCallback(url.location);
},
// called when the user clicks on the logout button
logout: () => {
return auth0.isAuthenticated().then(function (isAuthenticated) {
if (isAuthenticated) { // need to check for this as react-admin calls logout in case checkAuth failed
return auth0.logout({
redirect_uri: window.location.origin,
federated: true // have to be enabled to invalidate refresh token
});
}
return Promise.resolve()
})
},
// called when the API returns an error
checkError: ({status}) => {
if (status === 401 || status === 403) {
return Promise.reject();
}
return Promise.resolve();
},
// called when the user navigates to a new location, to check for authentication
checkAuth: () => {
return auth0.isAuthenticated().then(function (isAuthenticated) {
if (isAuthenticated) {
return Promise.resolve();
}
return auth0.getTokenSilently()
})
},
// called when the user navigates to a new location, to check for permissions / roles
getPermissions: () => {
return Promise.resolve()
},
};
Нам неясно, есть ли точка, из которой мы можем извлечь токен.
Ответ №1:
getTokenSilently должен вернуть вам жетон.
Вам нужно будет структурировать свое приложение React таким образом, чтобы у вас был доступ к результатам этого метода, прежде чем вы создадите своего поставщика данных.
Комментарии:
1. Я понимаю ваш комментарий «Вам придется структурировать свое приложение React…». Однако это означает, что мы не можем использовать AuthProvider react-администратора, я прав?
2. Я не совсем уверен, так как раньше не работал с react-admin, но я был бы удивлен, если бы это было так. Вам просто нужно убедиться, что вы извлекли токен, прежде чем визуализировать компонент, который в конечном итоге подключает поставщика данных администратора React