将密码重置令牌插入不受保护的NodeJS路由

时间:2019-04-11 14:17:07

标签: javascript node.js regex express authentication

我目前正在尝试将密码重置生成的令牌传递到我的不受保护的路由内,但是每当我执行 GET 请求时,我都会收到401 Unauthorized request

我尝试包括软件包 Reg-Path-RegExp ,并构造了一个单独的数组路由,但是它不起作用:

let tokens = [];
const unprotected = [
  pathToRegexp('/user/reset/:token', tokens),
];

我的密码重置令牌是在单独的服务中生成的,并在控制器中调用:

 const token = crypto.randomBytes(20).toString('hex');
          user.update({
            resetPasswordToken: token,
            resetPasswordExpires: Date.now() + 360000,
          });

这是我用expressJwt构建unless的方式:

app.use(expressJwt({
  secret: process.env.SECRET_BEARER,
  getToken: req => {

     MY TOKEN AUTHORISATION CODE IS PLACED HERE.
 }

}).unless({ path: ['/images/', '/user/password-reset', unprotected ]}));

我的问题是,每当我尝试创建未经认证的路由(如.unless({path: ['/images/', '/user/password-reset', '/user/reset/:token' ]}));时,路由/user/reset/:token仅被解析为字符串,而:token的值实际上并未传递。 / p>

我已经读过一些有关使用正则表达式或函数传递它的类似问题,但我自己却不知道。 Thisthis问题对于如何解决该问题特别有用。

2 个答案:

答案 0 :(得分:1)

您可以将regex传递给,除非您尝试使用Path-to-RegExp,否则可能已经意识到。您也可以尝试自己编写正则表达式并将其直接传递给,除非。在您的情况下,除非您看起来像这样:

.unless({ path: [/\/images\//, /\/user\/password-reset\//, /^\/user\/reset\/[a-z0-9_-]*/]}));

编辑:此SO answer建议您不能在同一数组中组合正则表达式和字符串,因此我已将所有路径都转换为正则表达式。

答案 1 :(得分:0)

您在数组中有一个数组,其中值path传递到unless

更改:

}).unless({ path: ['/images/', '/user/password-reset', unprotected ]}));

收件人:

}).unless({ path: unprotected }));

并更改unprotected以包括其他路径:

const unprotected = [
  '/images/',
  '/user/password-reset',
  pathToRegexp('/user/reset/:token', tokens),
];

确保您使用包含令牌的路径进行测试,例如: /user/reset/123-some-real-looking-value