我正在尝试构建一个我以端点为终点的应用程序,比方说B
,我只想在用户凭据有效时联系我。因此,在完成身份验证之后,我将用户重定向到端点B
。但令我惊讶的是,我无需登录即可直接输入B
端点。我该怎么做才能避免这种情况?我的应用程序只有登录名,没有注销,并且每次用户要访问端点B
时,我都希望用户登录。即使用户尝试手动转到该端点,我也希望用户重定向到登录名,我该怎么办?
[不允许访问特定路由http://localhost:3000/B,您可以在该端点的主要功能之前定义auth验证功能,然后通过终止auth功能中的请求(不允许主要功能)来中断功能执行顺序被称为。
更详细的解释:
虽然定义路由(LINE 27),您可以应用许多将被顺序调用的函数,但是如果在其中一个函数中您完成了请求(req),则下一个声明的函数不会将被调用,从而使主要功能无法访问;
当您在Express中收到请求时,您将收到作为回调的第三个参数,该回调将在定义的链中调用next函数(LINE 8,17
使用节点|表达进行身份验证的示例:
const express = require('express')
const app = express()
const port = 3000
const authentication = (req, res, next) => {
// todo verify authentication
if (true) {
next() // LINE 8
} else {
res.status(401).json({message: 'not authenticated'}) // LINE 10
}
}
const authorization = (req, res, next) => {
// todo verify authorization
if (true) {
next() // LINE 17
} else {
res.status(401).json({message: 'not authorized'}) // LINE 19
}
}
app.get('/', (req, res) => res.send('Hello World!'))
app.post('/login', (req, res) => res.send({token: 'magic-jwt-token'}))
app.get('/B', authentication, authorization, (req, res) => res.send('B works!')) // LINE 27
app.listen(port, () => console.log(`Example app listening on port ${port}!`))