下一个和JWT身份验证组件

时间:2020-06-14 10:46:13

标签: javascript reactjs jwt next.js jwt-auth

我一直在使用next.js创建一个简单的应用程序,并尝试正确地利用JWT进行用户身份验证。

我想使用一个导航栏和一个布局,并根据以下身份验证状态更改每个导航栏的详细信息。

import React from "react";
import Link from 'next/link'


const attributeStyle = "block mt-4 lg:inline-block lg:mt-0 uppercase font-semibold text-teal-200 hover:text-white mr-4"



export default function Navbar(token) {



  return (
    <>
      {/* Navbar */}
      <nav className="relative max-w-screen-xl mx-auto flex items-center justify-between px-4 sm:px-6">
        <div className="flex items-center flex-1">
          <div className="flex items-center justify-between w-full md:w-auto">
            <Link href="/"><a className={attributeStyle}>
              <div className="hidden md:block md:ml-10">
                <h1 className="font-medium text-white hover:text-gray-900 focus:outline-none focus:text-gray-900 transition duration-150 ease-in-out">Ubik</h1>
              </div>
            </a></Link>
            {/* <svg className="fill-white h-8 w-8 mr-2" width="54" height="54" viewBox="0 0 54 54" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 22.1c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05zM0 38.3c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05z"/></svg> */}


          </div>

        </div>
        {token ? (
        <div className="hidden md:block text-right">
          <span className="inline-flex rounded-md shadow-md">
            <span className="inline-flex rounded-md shadow-xs">
              <Link href="/account/login">
                <a className="inline-flex items-center px-4 py-2 border border-transparent text-base leading-6 font-medium rounded-md text-white bg-blue hover:bg-gray-50 hover:text-black focus:outline-none focus:shadow-outline transition duration-150 ease-in-out">
                  Log In
      </a>
              </Link>

            </span>
          </span>
        </div>
        ):( <div className="hidden md:block text-right">
        <span className="inline-flex rounded-md shadow-md">
          <span className="inline-flex rounded-md shadow-xs">
            <Link href="/account/login">
              <a className="inline-flex items-center px-4 py-2 border border-transparent text-base leading-6 font-medium rounded-md text-white bg-blue hover:bg-gray-50 hover:text-black focus:outline-none focus:shadow-outline transition duration-150 ease-in-out">
                Log out
    </a>
            </Link>

          </span>
        </span>
      </div>)}
      </nav>
      {/* End Navbar */}
    </>
  );
}

LayoutLanding

import Head from "next/head";
import Link from 'next/link'

import NavBar from './newNavBar';

import Footer from "./Footer";

const layoutStyle = {
  display: "flex",
  flexDirection: "column",
  height: "100%",
  width: "100%"
};

import { Cookies, CookiesProvider } from "react-cookie";
const cookies = new Cookies();
let token = cookies.get("token");


const LayoutLanding = props => (
  <div className="Layout" style={layoutStyle}>
    <Head>
      <title>{props.title}</title>
      <meta name="viewport" content="width=device-width, initial-scale=1" />
      <meta charSet="utf-8" />
    </Head>

    <div className=" bg-gray-900 relative pt-6 pb-16 md:pb-20 lg:pb-24 xl:pb-32  ">

      <NavBar token = {token}/>

    </div>
    <div>{props.children}</div>


<Footer/>
  </div>

);

export default LayoutLanding;

目前,我正在检查索引页面上的JWT身份验证,并将用户重定向到具有导航栏和布局的一组单独组件的另一页,这效率很低。但是,由于某些原因,当我将令牌通过layoutlanding传递到导航栏组件时,它不会注册。

这是我使用的解决方法的索引页面

import React from "react";
import PropTypes from "prop-types";
import { get } from "lodash/object";
import Link from "next/link";
import Router, { useRouter } from "next/router";
import { useRef, useState } from "react";

// import fetch from 'isomorphic-unfetch';
import { Cookies, CookiesProvider } from "react-cookie";
const cookies = new Cookies();
//containers

import LandingPage from "../containers/LandingPage";
import DataChoices from "../components/LandingPage/DataChoices.js";
// Layouts
import Layout from "../components/Layout/Layout";
import Chart from "../components/Visualization/Chart";
import Table from "../components/Visualization/HekticTable";


export default function index() {
  const searchRef = useRef<HTMLInputElement>(null);
  const [message, setMessage] = useState<any>(null);

  const [productList, setProductList] = useState<any>([]);
  const [searched, setSearched] = useState(false);

  const router = useRouter();

  let token = cookies.get("token");





  if (token == null) {

    return (
      <LandingPage />


    );
  }

  return (
    <div>
    <div>token</div>
    <LandingPage />
    </div>
  );
}

我在做什么错了,我将如何更好地解决这个问题,以免不必要地复制代码?

预先感谢:)

1 个答案:

答案 0 :(得分:1)

在导航栏中的参数中,而不是

export default function Navbar(token) {

您应该拥有

export default function Navbar({ token }) {

export default function Navbar(props) {
    const token = props.token;