如何使用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);