gpt4 book ai didi

node.js - JWT 未授权错误 : No authorization token was found (GET request with cookie)

转载 作者:搜寻专家 更新时间:2023-11-01 00:16:57 24 4
gpt4 key购买 nike

我有一个奇怪的问题,或者我不明白 JWT 在 Express 上下文中是如何工作的。

var express = require('express')
var app = express();
var expressJWT = require('express-jwt');
var jwt = require('jsonwebtoken');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var unless = require('express-unless');


app.set('secret', 'some secret');

app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use("/", expressJWT({secret:app.get('secret')})
.unless({
path:[
'/',
'/foo',
'/login'
]}
));


// my custom route middleware to verify a token
app.use(function(req, res, next) {
console.log("------------------------------------");
console.log("route middleware to verify a token");
console.log("");
// check header or url parameters or post parameters for token
var token = req.body.access_token || req.query.access_token || req.headers['x-access-token'] || req.cookies.access_token;
console.log("req.cookies.access_token:", req.cookies.access_token);
console.log("token:", token);
// decode token
if (token) {

// verifies secret and checks exp
jwt.verify(token, app.get('secret'), function(err, decoded) {
if (err) {
console.log("jwt.verify ERROR")
return res.json({ success: false, message: 'Failed to authenticate token.', err:err });
} else {
console.log("jwt.verify OK")
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});

} else {

// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});

}
});


app.get('/', function (req, res) {

res.send('Hello World!. /foo is open, /bar is protected. Login at /login')
})

app.get('/foo', function (req, res) {

res.send('Foo')
})

app.get('/bar', function (req, res) {
res.send('Foo')
})

app.get('/login', function (req, res) {
var username = 'mock_username';
var myToken = jwt.sign({username:username}, app.get('secret'));
res.cookie('access_token', myToken).send("logged in, check cookie");
})


app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})

我正在设置 JWT token 并将其保存到/login 路由中的 cookie。如果我在浏览器中检查 cookie(Chrome 中的开发工具),这会起作用并设置 token 。

  • 我访问/或 /foo 路由(如 unless 指定的那样不 protected ),浏览器显示正确的结果,但控制台仍然抛出 UnauthorizedError。如果我用“unless”将其明确标记为不 protected 路由,为什么控制台中会显示错误?

  • 我访问了 /bar 路由( protected ),我的中间件没有被调用,我在控制台和浏览器中都收到了 UnauthorizedError。我如何确保中间件确实在此处被触发,如果确实在我的中间件中找到并验证了 token ,我如何提供对该路由的访问?

最佳答案

I visit the / or /foo route (unprotected as specified with unless), and browser displays correct result, but the console still throws the UnauthorizedError. Why is the error showing in the console if I explicitly marked this as unprotected route with "unless"?

通过指定 unless,您使 //foo 路由不受 app.use("/", expressJWT (...) 而已,而不是来自后续的 middlewares。请求也将传递给您的自定义 middlware。

I visit /bar route (protected), my middleware is not being called, I get the UnauthorizedError both in console and the browser. How do I make sure the middleware does get triggered here, and how do I provide the access to this route if the token is indeed found and verified in my middleware?

因为,应用程序在 app.use("/", expressJWT(...)) 找不到 authorization token 时崩溃了。因此,它无法访问您的自定义中间件。

可能的解决方案:1

由于 JWT token 在您的情况下存储在 cookie 中,您可以设置 getToken 方法来获取 token 并让 express -jwt 来验证它,并完全删除您的自定义中间件。

例如

app.use("/", expressJWT({
secret : app.get('secret'),
getToken: function fromCookie (req) {
var token = req.cookies.access_token || req.body.access_token || req.query.access_token || req.headers['x-access-token'] ;
if (token) {
return token;
}
return null;
}
}).unless({
path:[
'/',
'/foo',
'/login'
]}
));

并处理错误

app.use(function (err, req, res, next) {
if (err.name === 'UnauthorizedError') {
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});

可能的解决方案:2

您可以通过实现自定义中间件(您已经完成)来执行自定义 jwt 验证。那么就完全不需要下面的中间件了。

删除以下行。

app.use("/", expressJWT({secret:app.get('secret')}).unless(...)

为了保护和取消保护路由,将 unprotected 路由放在自定义中间件之前,将 protected 路由放在自定义中间件之后(简单的方式)。

希望对你有帮助。

关于node.js - JWT 未授权错误 : No authorization token was found (GET request with cookie),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41888346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com