Эффект использования реакции с auth0 не работает для getAccessTokenSilently, как ожидалось

#reactjs #auth0

#reactjs #auth0

Вопрос:

У меня есть следующий компонент React, который я основал на этой документации на веб-сайте Auth0

вот мой код, в котором я пропустил несколько несвязанных строк

 import * as Auth0 from "@auth0/auth0-react";
import * as React from "react";
import * as ReactRedux from 'react-redux';

interface IProps{.....}
const AppComponent: React.SFC<IProps> = (props) => {

   const { getAccessTokenSilently } = Auth0.useAuth0();
   React.useEffect(() => {
     (async () => {
      try{
       const token = await getAccessTokenSilently();
       console.log(token);
       Props.setAccessToken(token); // this is a dispatch to save the token into redux state
      }
      catch(error){console.log(error);}
     })();
   }, [getAccessTokenSilently]);

   return(
   <> /*some jsx */ </>
   );
}

const mapDispatchToProps //standard redux mapping 
const mapStateToProps // standard redux mapping

export default ReactRedux.connect(mapStateToProps,mapDispatchToProps)(AppComponent);
  

поведение, которое я получаю, заключается в том, что после того, как компонент отобразит его, он регистрирует токен на консоли, однако после истечения срока действия токена useffect не происходит, чтобы получить новый токен, чего я и пытаюсь достичь. любая идея, что может быть неправильным, или если есть лучший способ добиться результата обновления токена доступа по истечении срока, при этом он тесно связан с конкретным действием.

Редактирование 1: я пропустил добавление, что обновление токена с интервалами невозможно, это будет поставляться как единый продукт для разных клиентов, и у каждого клиента есть свой собственный клиент Auht0, я не могу предположить определенный срок службы токена

Ответ №1:

Я использую созданный мной хук, вызываемый useInterval для обновления токена в фоновом режиме через определенные промежутки времени.

useInterval.ts

 import { useCallback, useEffect } from "react";

export const useInterval = (func: () => void, delay: number, startImmediately: boolean, funcDeps: React.DependencyList) => {
    const callback = useCallback(func, funcDeps);

    useEffect(() => {
        const handler = setInterval(callback, delay);
        startImmediately amp;amp; callback();
        return () => clearInterval(handler);
    }, [callback, delay, startImmediately]);
}
  

Использование в компоненте приложения

 useInterval(() => {
    // code to update access token
}, 300000, true, [dependencies]);
  

Комментарии:

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

2. Вы могли бы установить интервал на основе истечения срока действия токена и сделать его динамическим.

3. это стоит попробовать, я протестирую и дам вам знать

4. просто обновить настройку динамических интервалов оказалось непростым испытанием, поэтому пока я проигнорировал этот пункт, однако, если вы продолжите свою помощь и покажете мне пример с динамическими интервалами, исходящими от токена, я был бы благодарен