react-admin と hasura データ プロバイダーを使用して認証が必要なアプリケーションを実行しようとしています。ログイン成功後にヘッダーを変更する必要があります。現在、ヘッダーはページをリロードしたときにのみ更新されます。そうしないと、次のエラーがスローされます。
{"path":"$","error":"Malformed Authorization header","code":"invalid-headers"}
これは、app.js の現在のコードです。
import React, { useEffect } from 'react';
import { Admin, Resource, } from 'react-admin';
import Dashboard from './Dashboard';
import hasuraDataProvider from 'ra-data-hasura';
import authProvider from './authProvider';
import {Cookies} from "react-cookie";
import { AssociadoList, AssociadoShow } from "./Associado";
import portugueseMessages from 'ra-language-portuguese';
import LoginPage from "./Login";
import "./App.scss";
const ucookies = new Cookies();
const messages = {
'pt': portugueseMessages,
};
const i18nProvider = locale => messages[locale];
const dataProvider = () => {
const dataProvider = hasuraDataProvider(process.env.REACT_APP_HASURA_URL, { "content-type": "application/json", "Authorization": "Bearer " + ucookies.get("authToken")});
return dataProvider;
}
function App() {
return (
<Admin
dataProvider={dataProvider()}
authProvider={authProvider}
dashboard={Dashboard}
loginPage={LoginPage}
locale="pt" i18nProvider={i18nProvider}
>
<Resource name="adear.associado" list={AssociadoList} options={{ label: 'Associado' }} show={AssociadoShow} />
</Admin>
);
}
export default App;
そして、これは authprovider のコードです:
import { AUTH_LOGIN, AUTH_LOGOUT, AUTH_ERROR, AUTH_CHECK } from 'react-admin';
import graphql from './graphqlClient';
import Cookies from 'universal-cookie';
import { GraphQLClient } from 'graphql-request';
const cookies = new Cookies();
const LOGIN = `
mutation($username:String!, $password:String!){
login(username: $username, password: $password){
token
}
}
`;
const ME = `
query {
me {
username
}
}
`;
export default (type, params) => {
if (type === AUTH_LOGIN) {
const { username, password } = params;
return graphql.request(LOGIN, { username, password }).then(data => {
const token = data.login.token;
cookies.set("authToken", token, { path: "/", sameSite: "strict" });
localStorage.setItem("loggedIn", true);
//localStorage.setItem("reloaded", false);
});
}
if (type === AUTH_LOGOUT) {
cookies.set("authToken", "", { path: "/", sameSite: "strict" });
localStorage.setItem("loggedIn", false);
localStorage.removeItem("reloaded");
return Promise.resolve();
}
if (type === AUTH_ERROR) {
const graphqlauth = new GraphQLClient(process.env.REACT_APP_HASURA_ENDPOINT, {
headers: {
authorization: 'Bearer ' + cookies.get('authToken'),
},
})
return graphqlauth.request(ME).then(data => { return (data.me.username) ? Promise.resolve() : Promise.reject(); }).catch(e => {
cookies.set("authToken", "", { path: "/", sameSite: "strict" });
localStorage.setItem("loggedIn", false);
});
}
if (type === AUTH_CHECK) {
const graphqlauth = new GraphQLClient(process.env.REACT_APP_HASURA_ENDPOINT, {
headers: {
authorization: 'Bearer ' + cookies.get('authToken'),
},
})
return graphqlauth.request(ME).then(data => { return (data.me.username) ? Promise.resolve() : Promise.reject(); });
//return cookies.get('authToken') && cookies.get('authToken') !== "" ? Promise.resolve() : Promise.reject();
}
return Promise.resolve();
};
ページをリロードすると、エラーは発生しません。状態を使用しようとしましたが、ヘッダーを変更することは不可能のようです。