【发布时间】:2021-03-16 03:04:20
【问题描述】:
我的目标是重定向到主页“/”
但是“/”页面附有中间件检查用户是否有TOKEN
我想重定向到“/”带有 Bearer TOKEN 标头
不带 AJAX
所以,我在服务器上新建了一个路径“/loginDetour”
并通过 TOKEN Header
使用 FETCH 到此路径
然后,"/loginDetour"server 使页面重定向到“/”
但是....它不起作用..
这是我的代码
主路由器
const express = require('express');
const app = express();
const hbs = require('express-handlebars');
const path = require('path');
const PORT = process.env.PORT || 5000;
const layoutsDir = path.join(__dirname, './views/layouts');
const partialsDir = path.join(__dirname, './views/partials');
const publicPath = path.join(__dirname, './public');
const authRouter = require('./server/routes/authRouter');
const weatherRouter = require('./server/routes/weatherRouter');
const todoRouter = require('./server/routes/todoRouter');
app.set('view engine', 'hbs');
app.engine(
'hbs',
hbs({
extname: 'hbs',
defaultLayout: 'layout',
layoutsDir,
partialsDir,
})
);
if (process.env.NODE_ENV === 'production') {
app.get('view cache');
}
app.use(express.static(publicPath));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
const checkAuth = require('./server/middleware');
app.use(authRouter.routes);
app.use('/weather', checkAuth, weatherRouter.routes);
app.use('/todo', checkAuth, todoRouter.routes);
app.get('/', checkAuth, (req, res) => {
res.render('index');
});
app.listen(PORT, () => {
console.log(`Server started on Port ${PORT}`);
});
登录路由器
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
await auth.signInWithEmailAndPassword(email, password);
const token = await auth.currentUser.getIdToken(true);
return res.json(token)
} catch (err) {
res.status(400).render('login', {
err: err.message,
style: 'login',
isRegister: false,
type: 'Login',
});
}
});
router.get('/loginDetour', async (req, res) => {
try {
const tokenBearered = req.headers.authorization;
res.setHeader('Authorization', tokenBearered);
return res.status(302).redirect('/');
} catch (err) {
res.status(400).json({ errMsg: error.message });
}
});
中间件
const checkAuth = async (req, res, next) => {
if (!req.headers.authorization) {
return res.redirect('/login');
}
const token = req.headers.authorization.split('Bearer ')[1];
const decoded = await admin.auth().verifyIdToken(token);
if (!decoded.uid) {
return res.redirect('/login');
}
// const userRecord = await admin.auth().getUser(decoded.uid);
// console.log(userRecord.toJSON());
req.uid = decoded.uid;
next();
};
module.exports = checkAuth;
前台(登录)
1.登录
2.fetch到POST'/login'
3.Server给TOKEN & Save到本地
4.使用令牌头获取 GET'/loginDetour'
3.服务器重定向到'/'
<script type="module">
import { errAlert } from './js/errAlert.js'
import { defaultHeader }from './js/auth/auth.js'
const form = document.querySelector('.login-form')
const isRegister = {{isRegister}}
const authHandler = async(e) =>{
e.preventDefault();
const email = form['email'].value;
const password = form['password'].value;
let userName = ''
let password2 =''
if(isRegister){
userName = form['userName'].value;
password2 = form['password2'].value;
if(password !== password2){
errAlert("Password and Confirmed doesn't matched", 4000)
}
}
const url = isRegister ? '/register' : '/login'
const config = {
method: 'POST',
body: JSON.stringify({ email, password, userName }),
headers: {
'Content-Type': 'application/json',
},
};
const res = await fetch(url, config)
const token = await res.json()
if(token){
localStorage.setItem('token', token)
const config = {
method: 'GET',
redirect: 'follow',
headers: {
Authorization: `Bearer ${token}`,
}
};
axios('/loginDetour', config)
}
}
form.addEventListener("submit", authHandler)
</script>
SOS TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/questions/66594404/…
-
页面不会被ajax请求重定向,而是需要检查请求的状态并手动跟随重定向。或者更好,而不是向
loginDetour发出新请求,只需重定向到if (token)块中的/ -
@FredStark 我认为stackoverflow.com/a/66595622/441757 的答案不正确。请参阅我的评论:浏览器不会将 3xx 重定向暴露给您的前端 JavaScript 代码。相反,浏览器会自动跟随重定向——因此,例如,前端 JavaScript 代码中的
if(response.status === 302)之类的条件将永远无法达到。 -
是的,你是对的
标签: javascript node.js redirect