#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. Спасибо за ваш ответ, но это не решает проблему.