aws-amplify / ui-reac, можно перенаправить после входа в систему

#reactjs #react-router-dom #aws-amplify

#reactjs #react-router-dom #aws-amplify

Вопрос:

Здравствуйте, я пытаюсь перенаправить и изменить свой путь после входа в систему с помощью AWS-amplify и с помощью react-dom

Мне нужно после входа пользователя перенаправить их на localhost/main main, потому что его порог в localhost/

Если у кого-нибудь есть идея, я могу поблагодарить вас за мой код:

 import React from "react";
import "./App.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Amplify from "aws-amplify";
import {
  AmplifyAuthenticator,
  AmplifySignUp,
} from "@aws-amplify/ui-react";
import { AuthState, onAuthUIStateChange } from "@aws-amplify/ui-components";
import awsconfig from "./aws-exports";
import Main from "./main";

Amplify.configure(awsconfig);

const AuthStateApp = () => {
  const [authState, setAuthState] = React.useState();
  const [user, setUser] = React.useState();

  React.useEffect(() => {
    return onAuthUIStateChange((nextAuthState, authData) => {
      setAuthState(nextAuthState);
      setUser(authData);
    });
  }, []);

  return authState === AuthState.SignedIn amp;amp; user ? (
    <Router>
      <Switch>
        <Route path="/main">
          <Main />
        </Route>
      </Switch>
    </Router>
  ) : (
    <AmplifyAuthenticator>
      <AmplifySignUp
        slot="sign-up"
        formFields={[
          { type: "username" },
          { type: "password" },
          { type: "email" },
        ]}
      />
    </AmplifyAuthenticator>
  );
};

export default AuthStateApp;
  

Ответ №1:

после поиска по этой проблеме решение состоит в том, чтобы создать свой собственный дизайн для входа и регистрации с помощью AUTH.signIn() and Auth.signUp() , и вы можете перенаправить после.

Ответ №2:

Я использую angular, но я думаю, что это может быть похоже

   onAuthUIStateChange((authState, authData) => {
            console.log('LoginPage', authState, authData);
            if (this.authState == AuthState.SignedIn) {
                this.router.navigate(['']);
            }
        });
  

Ответ №3:

Обычно я делаю так:

  1. оберните <router> с <AwsAuthenticator> помощью компонента, который вы будете использовать для проверки и требовать аутентификации.
  2. В AwsAuthenticator.tsx (или js, если вы не используете typescript) вы сделаете это:
 // @ts-ignore
import {Authenticator} from 'aws-amplify-react-native';
import React, {ReactNode, useState} from 'react';
import {signUpConfig} from '@app/components/Authentication/SignUpForm.config';

interface AwsAuthenticatorProps {
  children: ReactNode;
}

export const AwsAuthenticator = ({children}: AwsAuthenticatorProps) => {
  const [loggedIn, setLoggedIn] = useState<boolean>(false);

  // possible states: signIn | signedIn | signedOut
  const handleAuthStateChange = (authState: string) =>
    authState === 'signedIn' ? setLoggedIn(true) : setLoggedIn(false);

  return loggedIn ? (
    <>{children}</>
  ) : (
    <Authenticator
      usernameAttributes="email"
      signUpConfig={signUpConfig}
      onStateChange={handleAuthStateChange}
    />
  );
};
  

Ответ №4:

Это сработало для меня, но оно будет перенаправлять вас на / main каждый раз, когда вы обновляете страницу, а не только после входа в систему.

Просто импортируйте useNavigate для подключения react-router-dom, установите для него переменную, а затем вызовите ее внутри useEffect

Посмотрите, как это реализовано в вашем коде

 import React from "react";
import "./App.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Amplify from "aws-amplify";
import {
  AmplifyAuthenticator,
  AmplifySignUp,
} from "@aws-amplify/ui-react";
import { AuthState, onAuthUIStateChange } from "@aws-amplify/ui-components";
import awsconfig from "./aws-exports";
import Main from "./main";
import { useNavigate } from "react-router-dom";

Amplify.configure(awsconfig);

const AuthStateApp = () => {
  const [authState, setAuthState] = React.useState();
  const [user, setUser] = React.useState();
  const navigate = useNavigate();

  React.useEffect(() => {
    return onAuthUIStateChange((nextAuthState, authData) => {
      setAuthState(nextAuthState);
      setUser(authData);
      navigate("/main");
    });
  }, []);

  return authState === AuthState.SignedIn amp;amp; user ? (
    <Router>
      <Switch>
        <Route path="/main">
          <Main />
        </Route>
      </Switch>
    </Router>
  ) : (
    <AmplifyAuthenticator>
      <AmplifySignUp
        slot="sign-up"
        formFields={[
          { type: "username" },
          { type: "password" },
          { type: "email" },
        ]}
      />
    </AmplifyAuthenticator>
  );
};

export default AuthStateApp;