mongoose 如何使用nodejs和express设置授权头

wb1gzix0  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(165)

我正在设置一个网站与nodejs,表达,mongoose和swig模板以下本教程:Authenticate a Node.js API with JSON Web Tokens
在本教程中,作者使用Postman来设置标头中的标记。我在谷歌上搜索了几天,想知道如何在我的网站标头中设置jwt标记,但它对我不起作用。

dfuffjeb

dfuffjeb1#

如果您希望客户端在其请求报头中包含令牌,您可以使用带有express的cookie解析器(HTML5 Web存储是另一种选择)。
Express可以设置响应标头以告诉客户端“将令牌添加到cookie中”。
一旦客户机用令牌设置了cookie,令牌就会出现在客户机的每个请求的请求头中。

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以在用户通过身份验证时保存令牌。
  • 在允许访问受保护的路由之前,请检查Cookie头值。
  • 如果用户在试图访问需要令牌的API路由时没有他们的令牌,则发送回未授权状态。
relj7zay

relj7zay2#

"也许能在将来帮助别人“
将令牌存储在带有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();
});

这将在来自浏览器的每个get请求中添加authorization=Bearer <token>头。现在,通过添加以下中间件来验证每个安全路由中的令牌:
输入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);

相关问题