Авторизация пользователя

#javascript #node.js #reactjs #express

#javascript #node.js #reactjs #выражать

Вопрос:

У меня возникла небольшая проблема с авторизацией администратора. Внутренний код работает, но у меня возникли проблемы с запросом маршрута администратора и аутентификацией вошедшего в систему пользователя. Первое, что я попробовал, это поместить значение isAdmin в файлы cookie, но это было небезопасно. Затем я попытался проверить администратора с помощью файлов cookie, я использовал cookie.get(), чтобы получить токен. Но это не увенчалось успехом.

авторизация по коду:

 const isAdmin = async (req, res, next) => {
    if (!req.user.isAdmin) {
        res.status(401).send({ msg: "Not an authorized admin" });
    } else {
        res.send(req.user.isAdmin);
        // const token = req.header("auth-token");
        // const verified = verify(token, process.env.SECRET);
        // req.user = verified;
        // next();
    }
    next();
};
 

маршрут администратора кода:

router.get("/adminPanel", isAuth, isAdmin, (req, res) => {});

страница входа в систему с кодом:

 const handleSubmit = e => {
        e.preventDefault();
        Axios.post("http://localhost:5000/users/login", {
            email,
            password,
        })
            .then(response => {
                cookie.set("token", response.data.token, {
                    expires: 1,
                });

                setUser({
                    token: response.data.token,
                });
                if (response.data.isAdmin) {
                    alert("admin");
                } else {
                    alert("not an admin");
                }
                // console.log(response.data.token);
                // console.log(response.data.isAdmin);
            })

            .catch(err => {
                console.log(err);
            });
    };
 

страница администратора кода:

 import React, { useContext, useEffect, useState } from "react";
import Axios from "axios";
import { userContext } from "../../App";

export default function Home() {
    const [user, setUser] = useContext(userContext);
    const [content, setContent] = useState("login plz to display the content");
    useEffect(() => {
        // Axios.get("http://localhost:5000/users/adminPanel").then(response =>
        //  console.log(response.data),
        // );
        // async function fetchAdmin() {const result = await
        Axios.get("http://localhost:5000/users/adminPanel", {
            headers: {
                Authorization: `Bearer ${user.isAdmin}`,
            },
        });
        // }
        // fetchAdmin();
        // async function fetchProtected() {
        //  const result = await (
        //      await fetch("http://localhost:5000/users/adminPanel", {
        //          method: "GET",
        //          headers: {
        //              "Content-Type": "application/json",
        //              authorization: `Bearer ${user.token}`,
        //          },
        //      })
        //  ).json();
        //  if (result.isAdmin) setContent("Admin");
        // }
        // fetchProtected();
    }, [user]);

    return `${content}`;
}
 

Получение токена из файлов cookie:

 const [user, setUser] = useState({});
    useEffect(() => {
        setUser({ token: cookie.get("token") });
    }, []);
    console.log(user);
 

Ответ №1:

Принимая во внимание ваш маршрут

 router.get("/adminPanel", isAuth, isAdmin, (req, res) => {});
 

Я предполагаю req.user.isAdmin , что он установлен в isAuth промежуточном программном обеспечении, поэтому ваше isAdmin промежуточное программное обеспечение должно проверить этот параметр, пропустить его, если это так, или отклонить его в противном случае.

В isAuth промежуточном программном обеспечении после проверки пользователя вы должны знать, является ли он администратором или нет, поэтому просто установите параметр следующим образом:

 const isAuth = async (req, res, next) => {
  // other code
  req.user.isAdmin = true // put your logic here to reflect the status
  next(); // pass the control to next middleware, in your example to isAdmin
}
 

Наконец isAdmin , может выглядеть так:

 const isAdmin = async (req, res, next) => {
    if (!req.user.isAdmin) {
        res.status(401).send({ msg: "Not an authorized admin" });
    } else {
        next();
    }
};
 

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

1. Спасибо за ваш ответ, но это не решает проблему.