@ auth0 / auth0-spa- js isAuthenticated не определен при обновлении страницы - PullRequest
1 голос
/ 26 января 2020

Я работаю над аутентификацией моего приложения, и мне удалось добавить логин на мою страницу. Пользователи могут войти в систему, и их сеанс сохраняется, однако, как только я обновлю sh страницу, их сеанс пропал. ReactJs + Далее JS

Я знаю, что есть getTokenSilently , но он вернет это, когда я позвоню!

error: "login_required"
error_description: "Login required"
state: "N3B+aWt4T1dBeGlibWsua2ZkdX5LTzR6T19ndTdXfkJ2Tm5kUzJIY3lXTQ=="

Что я здесь не так делаю ?

  • Страница моего профиля!
  useEffect(() => {
    if (typeof window !== `undefined`) {
      if (!loading && !isAuthenticated) {
        loginWithRedirect({})
      }
    }
  });
  • Домашняя страница, на которой отображается значок, если пользователь вошел в систему!
          <Button
            className="account-button"
            variant="textButton"
            icon={<i className="flaticon-user" />}
            aria-label="login"
            title={loading ? 'loading' : isAuthenticated ? 'Hi' : 'login'}
          />
  • Автосервис
// src/react-auth0-spa.js
import React, { useState, useEffect, useContext } from "react";
import createAuth0Client from "@auth0/auth0-spa-js";

const DEFAULT_REDIRECT_CALLBACK = () =>
  window.history.replaceState({}, document.title, window.location.pathname);

export const Auth0Context = React.createContext();
export const useAuth0 = () => useContext(Auth0Context);
export const Auth0Provider = ({
  children,
  onRedirectCallback = DEFAULT_REDIRECT_CALLBACK,
  ...initOptions
}) => {
  const [isAuthenticated, setIsAuthenticated] = useState();
  const [user, setUser] = useState();
  const [auth0Client, setAuth0] = useState();
  const [loading, setLoading] = useState(true);
  const [popupOpen, setPopupOpen] = useState(false);

  useEffect(() => {
    const initAuth0 = async () => {
      const auth0FromHook = await createAuth0Client(initOptions);
      setAuth0(auth0FromHook);

      if (window.location.search.includes("code=") &&
          window.location.search.includes("state=")) {
        const { appState } = await auth0FromHook.handleRedirectCallback();
        onRedirectCallback(appState);
      }

      const isAuthenticated = await auth0FromHook.isAuthenticated();

      setIsAuthenticated(isAuthenticated);

      if (isAuthenticated) {
        const user = await auth0FromHook.getUser();
        setUser(user);
      }

      setLoading(false);
    };
    initAuth0();
    // eslint-disable-next-line
  }, []);

  const loginWithPopup = async (params = {}) => {
    setPopupOpen(true);
    try {
      await auth0Client.loginWithPopup(params);
    } catch (error) {
      console.error(error);
    } finally {
      setPopupOpen(false);
    }
    const user = await auth0Client.getUser();
    setUser(user);
    setIsAuthenticated(true);
  };

  const handleRedirectCallback = async () => {
    setLoading(true);
    await auth0Client.handleRedirectCallback();
    const user = await auth0Client.getUser();
    setLoading(false);
    setIsAuthenticated(true);
    setUser(user);
  };
  return (
    <Auth0Context.Provider
      value={{
        isAuthenticated,
        user,
        loading,
        popupOpen,
        loginWithPopup,
        handleRedirectCallback,
        getIdTokenClaims: (...p) => auth0Client.getIdTokenClaims(...p),
        loginWithRedirect: (...p) => auth0Client.loginWithRedirect(...p),
        getTokenSilently: (...p) => auth0Client.getTokenSilently(...p),
        getTokenWithPopup: (...p) => auth0Client.getTokenWithPopup(...p),
        logout: (...p) => auth0Client.logout(...p)
      }}
    >
      {children}
    </Auth0Context.Provider>
  );
};

1 Ответ

1 голос
/ 26 января 2020

Проблема была в использовании Brave Browser !!!!!! Подробное описание здесь:

Справа. Таким образом, проблема тихой аутентификации, ошибка «требуется вход в систему», возникает, когда ваш браузер не отправляет или не может отправить «auth0» cook ie. Это повар ie, который Auth0 оставляет на клиенте браузера, как только пользователь имеет сеанс с Auth0, то есть пользователь вошел в систему через интерактивный поток. Вы должны быть в состоянии подтвердить это, просматривая сетевые журналы или анализируя выход HAR. Сценарий ios, который работает, будет иметь присоединенного повара ie, в то время как тот, который потерпит неудачу, не будет. Если это так, то это не проблема образца или SDK, поскольку они не участвуют в настройке этого файла cookie; он выдается сервером авторизации.

Если браузер не может отправить этот повар ie, это, скорее всего, связано с каким-либо программным обеспечением или расширением браузера или чем-то, что блокирует сторонние файлы cookie для отслеживания. Safari делает это по умолчанию благодаря встроенному программному обеспечению Intelligent Tracking Prevention (ITP2) 1. Это может объяснить, почему тихая аутентификация работает в режиме инкогнито Chrome, но не в обычном режиме. Если вы используете некоторые расширения, возможно, вы захотите отключить некоторые из них, чтобы определить, какое из них препятствует отправке повара ie.

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

https://community.auth0.com/t/failed-silent-auth-login-required/33165/24

...