一、jwt服务器开发
const express = require("express");
const app = express();
const cors = require("cors");
const path = require("path");
const staticRoot = path.resolve(__dirname, "../public");
app.use(express.static(staticRoot));
const whiteList = ["null", "http://localhost:5008"];
app.use(
cors({
origin(origin, callback) {
if (!origin) {
callback(null, "*");
return;
}
if (whiteList.includes(origin)) {
callback(null, origin);
} else {
callback(new Error("not allowed"));
}
},
credentials: true,
})
);
const secrect = "jimo";
const cookieKey = "token";
const jwt = require("jsonwebtoken");
exports.publish = function (res, maxAge = 3600 * 24, info = {
}) {
const token = jwt.sign(info, secrect, {
expiresIn: maxAge,
});
res.cookie(cookieKey, token, {
maxAge: maxAge * 1000,
path: "/",
});
res.header("authorization", token);
};
exports.verify = function (req) {
let token;
token = req.cookies[cookieKey];
if (!token) {
token = req.headers.authorization;
if (!token) {
return null;
}
token = token.split(" ");
token = token.length === 1 ? token[0] : token[1];
}
try {
const result = jwt.verify(token, secrect);
return result;
} catch(err) {
return null;
}
};
const {
getErr } = require("./getSendResult");
const {
pathToRegexp } = require("path-to-regexp");
const jwt = require("./jwt");
const needTokenApi = [
{
method: "POST", path: "/api/student" },
{
method: "PUT", path: "/api/student/:id" },
{
method: "GET", path: "/api/student" },
{
method: "GET", path: "/api/admin/user" },
];
module.exports = (req, res, next) => {
const apis = needTokenApi.filter((api) => {
const reg = pathToRegexp(api.path);
return api.method === req.method && reg.test(req.path);
});
if (apis.length === 0) {
next();
return;
}
const result = jwt.verify(req);
if (result) {
req.userId = result.id;
next();
} else {
handleNonToken(req, res, next);
}
};
function handleNonToken(req, res, next) {
res
.status(403)
.send(getErr("you dont have any token to access the api", 403));
}
const express = require("express");
const router = express.Router();
const adminServ = require("../../services/adminService");
const {
asyncHandler } = require("../getSendResult");
const jwt = require("../jwt");
router.post(
"/login",
asyncHandler(async (req, res) => {
const result = await adminServ.login(req.body.loginId, req.body.loginPwd);
if (result) {
let value = result.id;
jwt.publish(res, undefined, {
id: value });
}
return result;
})
);
router.get("/user", asyncHandler(async (req, res) => {
return await adminServ.getAdminById(req.userId)
}));
module.exports = router;