如何使用nodejs和express设置权限headers
How to set authorization headers with nodejs and express
我正在按照本教程使用 nodejs、express、mongoose 和 swig 模板设置一个站点:
Authenticate a Node.js API with JSON Web Tokens
本教程作者使用Postman在header中设置token。
我在谷歌上搜索了好几天,想知道如何在我网站的 header 中设置 jwt 令牌,但它对我不起作用。
如果您希望客户端在其请求 header 中包含令牌,您可以将 cookie 解析器与 express 结合使用。 (HTML5 网络存储是另一种选择)。关于 Cookie:
Express 可以设置响应headers 来告诉客户端"add the token to a cookie"。
一旦客户端使用令牌设置 cookie,令牌将在客户端的每个请求的请求 header 中。让我们开始烘焙吧
npm install cookie-parser
撒上一些
var cookieParser = require('cookie-parser')
app.use(cookieParser())
访问并设置 cookie:
app.use(function (req, res, next) {
var cookie = req.cookies.jwtToken;
if (!cookie) {
res.cookie('jwtToken', theJwtTokenValue, { maxAge: 900000, httpOnly: true });
} else {
console.log('let's check that this is a valid cookie');
// send cookie along to the validation functions...
}
next();
});
你可能想用 cookie 做这些事情(或者你最终使用的任何方法):
- 设置 cookie 以在用户通过身份验证时保存令牌。
- 在允许访问 protected 之前检查 cookie header 值
路线。
- 如果用户没有令牌,则发回未授权状态
当他们试图访问 api 需要令牌的路由时。
将来可能会帮助某人...
使用 httpOnly:true
标志将令牌存储在 cookie
中非常安全,可以免受 XSS 攻击,但它可能容易受到 CSRF 攻击。
使用中间件为 express
中的所有路由添加自定义 request headers
可能是一个可行的解决方案,例如:
var token;
//asign 'accessToken' to 'token' in app.post('/login')
token=accessToken;
app.all('*' , (req, res, next) => {
if (!token) {
console.log('token: undefined');
} else {
req.headers.authorization = 'Bearer ' + token;
}
next();
});
这将在来自浏览器的每个获取请求中添加 authorization=Bearer <token>
header。现在通过添加此中间件在每个安全路由中验证令牌:
让进来app.get('/dashboard')
const authenticateToken=(req, res, next)=>{
var authHeader=req.headers['authorization'];
var token=authHeader && authHeader.split(' ')[1];
if(token==null){
return res.sendStatus(401);
}
jwt.verify(token, process.env.JWT_ACCESS_TOKEN, (err, user)=>{
if(err){
return res.sendStatus(403);
}
req.user=user;
next();
})
}
//in app.get(...)
app.get('/dashboard', authenticateToken ,()=>{
//stuff for authorized user
})
如果您在另一个文件中定义了 app.post('/login')
,那么,
导出 addHeader
中间件如下:
//var to access token outside app.post('/login') route
var token;
app.post('/login' , (req , res)=>{
//authenticate the user
//create token
const accessToken=jwt.sign(user, secretKey);
//assign 'accessToken' to 'token' var
token=accessToken
//redirect to secure route
res.redirect('dashboard');
}
//middleware to add in your 'index.js' or 'app.js' file.
//export it only if you define app.post('/login') in another file
exports.addHeader = (req, res, next) => {
if (!token) {
console.log('token: undefined');
} else {
req.headers.authorization = 'Bearer ' + token;
}
next();
}
在index.js
或app.js
//import file in which app.post('/login') is defined. let it is defined in controller/auth
const authController=require('./controller/auth');
//to add custom header in all routes
app.all('*', authController.addHeader);
我正在按照本教程使用 nodejs、express、mongoose 和 swig 模板设置一个站点: Authenticate a Node.js API with JSON Web Tokens
本教程作者使用Postman在header中设置token。 我在谷歌上搜索了好几天,想知道如何在我网站的 header 中设置 jwt 令牌,但它对我不起作用。
如果您希望客户端在其请求 header 中包含令牌,您可以将 cookie 解析器与 express 结合使用。 (HTML5 网络存储是另一种选择)。关于 Cookie:
Express 可以设置响应headers 来告诉客户端"add the token to a cookie"。
一旦客户端使用令牌设置 cookie,令牌将在客户端的每个请求的请求 header 中。让我们开始烘焙吧
npm install cookie-parser
撒上一些
var cookieParser = require('cookie-parser')
app.use(cookieParser())
访问并设置 cookie:
app.use(function (req, res, next) {
var cookie = req.cookies.jwtToken;
if (!cookie) {
res.cookie('jwtToken', theJwtTokenValue, { maxAge: 900000, httpOnly: true });
} else {
console.log('let's check that this is a valid cookie');
// send cookie along to the validation functions...
}
next();
});
你可能想用 cookie 做这些事情(或者你最终使用的任何方法):
- 设置 cookie 以在用户通过身份验证时保存令牌。
- 在允许访问 protected 之前检查 cookie header 值 路线。
- 如果用户没有令牌,则发回未授权状态 当他们试图访问 api 需要令牌的路由时。
将来可能会帮助某人...
使用 httpOnly:true
标志将令牌存储在 cookie
中非常安全,可以免受 XSS 攻击,但它可能容易受到 CSRF 攻击。
使用中间件为 express
中的所有路由添加自定义 request headers
可能是一个可行的解决方案,例如:
var token;
//asign 'accessToken' to 'token' in app.post('/login')
token=accessToken;
app.all('*' , (req, res, next) => {
if (!token) {
console.log('token: undefined');
} else {
req.headers.authorization = 'Bearer ' + token;
}
next();
});
这将在来自浏览器的每个获取请求中添加 authorization=Bearer <token>
header。现在通过添加此中间件在每个安全路由中验证令牌:
让进来app.get('/dashboard')
const authenticateToken=(req, res, next)=>{
var authHeader=req.headers['authorization'];
var token=authHeader && authHeader.split(' ')[1];
if(token==null){
return res.sendStatus(401);
}
jwt.verify(token, process.env.JWT_ACCESS_TOKEN, (err, user)=>{
if(err){
return res.sendStatus(403);
}
req.user=user;
next();
})
}
//in app.get(...)
app.get('/dashboard', authenticateToken ,()=>{
//stuff for authorized user
})
如果您在另一个文件中定义了 app.post('/login')
,那么,
导出 addHeader
中间件如下:
//var to access token outside app.post('/login') route
var token;
app.post('/login' , (req , res)=>{
//authenticate the user
//create token
const accessToken=jwt.sign(user, secretKey);
//assign 'accessToken' to 'token' var
token=accessToken
//redirect to secure route
res.redirect('dashboard');
}
//middleware to add in your 'index.js' or 'app.js' file.
//export it only if you define app.post('/login') in another file
exports.addHeader = (req, res, next) => {
if (!token) {
console.log('token: undefined');
} else {
req.headers.authorization = 'Bearer ' + token;
}
next();
}
在index.js
或app.js
//import file in which app.post('/login') is defined. let it is defined in controller/auth
const authController=require('./controller/auth');
//to add custom header in all routes
app.all('*', authController.addHeader);