代码之家  ›  专栏  ›  技术社区  ›  Dean Hiller

如何在typescript中为auth0创建受保护的路由?

  •  0
  • Dean Hiller  · 技术社区  · 3 年前

    如何使用创建受保护的路由 react-router-dom 并将响应存储在localStorage中,以便用户下次尝试打开时可以再次查看其详细信息。登录后,他们应该重定向到仪表板页面。

    所有功能都添加在ContextApi中。 Codesandbox链接: Code

    我试过了,但没能实现

    路线页面

    import React, { useContext } from "react";
    import { globalC } from "./context";
    import { Route, Switch, BrowserRouter } from "react-router-dom";
    import About from "./About";
    import Dashboard from "./Dashboard";
    import Login from "./Login";
    import PageNotFound from "./PageNotFound";
    
    function Routes() {
      const { authLogin } = useContext(globalC);
      console.log("authLogin", authLogin);
    
      return (
        <BrowserRouter>
          <Switch>
            {authLogin ? (
              <>
                <Route path="/dashboard" component={Dashboard} exact />
                <Route exact path="/About" component={About} />
              </>
            ) : (
              <Route path="/" component={Login} exact />
            )}
    
            <Route component={PageNotFound} />
          </Switch>
        </BrowserRouter>
      );
    }
    export default Routes;
    

    上下文页面

    import React, { Component, createContext } from "react";
    import axios from "axios";
    
    export const globalC = createContext();
    
    export class Gprov extends Component {
      state = {
        authLogin: null,
        authLoginerror: null
      };
      componentDidMount() {
        var localData = JSON.parse(localStorage.getItem("loginDetail"));
        if (localData) {
          this.setState({
            authLogin: localData
          });
        }
      }
    
      loginData = async () => {
        let payload = {
          token: "ctz43XoULrgv_0p1pvq7tA",
          data: {
            name: "nameFirst",
            email: "internetEmail",
            phone: "phoneHome",
            _repeat: 300
          }
        };
        await axios
          .post(`https://app.fakejson.com/q`, payload)
          .then((res) => {
            if (res.status === 200) {
              this.setState({
                authLogin: res.data
              });
              localStorage.setItem("loginDetail", JSON.stringify(res.data));
            }
          })
          .catch((err) =>
            this.setState({
              authLoginerror: err
            })
          );
      };
      render() {
        // console.log(localStorage.getItem("loginDetail"));
        return (
          <globalC.Provider
            value={{
              ...this.state,
              loginData: this.loginData
            }}
          >
            {this.props.children}
          </globalC.Provider>
        );
      }
    }
    
    0 回复  |  直到 2 年前