我如何在 JWT 中使用通配符,除非?

Posted

技术标签:

【中文标题】我如何在 JWT 中使用通配符,除非?【英文标题】:How do I use a wildcard in JWT unless? 【发布时间】:2016-12-13 18:45:31 【问题描述】:

我正在使用 express-jwt 来保护我的节点应用程序,并且想知道如何在除非参数中使用通配符。我的工作代码如下,我真正想做的是开放对路径以“/login”开头的任何内容的访问,这样我就不必列出每一个资源。当我将 '/login*' 添加到 unprotected 数组时,它最终会以 401/unauthorized 阻止 /login。

作品:

// routes open to all
var unprotected = [
  '/login',
  '/login/app/main.js',
  'favicon.ico'
];

// configure jwt
var jwtCheck = jwt(
  secret: new Buffer(config.get('auth0.secret'), 'base64'),
  audience: config.get('auth0.clientid')
);

// insert jwt middleware
app.use( jwtCheck.unless(path: unprotected) );

不起作用:

// routes open to all
var unprotected = [
  '/login*',
  'favicon.ico'
];

// configure jwt
var jwtCheck = jwt(
  secret: new Buffer(config.get('auth0.secret'), 'base64'),
  audience: config.get('auth0.clientid')
);

// insert jwt middleware
app.use( jwtCheck.unless(path: unprotected) );

【问题讨论】:

该模块使用 express-unless 所以你所做的应该可以工作,你能检查版本等吗? 我正在使用最新版本的 express-unless (0.3.0) 和 express-jwt (3.4.0) 【参考方案1】:

正则表达式需要存在于引号之外:

var unprotected = [
  /\/login*/,
  /favicon.ico/
];

请注意,此时使用 express-除非您不能在同一个配置数组中混合正则表达式和字符串,这就是为什么第二个参数需要使用正斜杠而不是引号。

【讨论】:

【参考方案2】:

您可以使用path-to-regexp,而无需自己编写那些丑陋的正则表达式。

示例如下:

const pathToRegexp = require('path-to-regexp');

// Use JWT auth to secure the API
const unprotected = [
    pathToRegexp('/login*'),
    pathToRegexp('/favicon.ico')
];

app.use(expressJwt( secret: config.tokenSecret ).unless( path: unprotected ));

【讨论】:

以上是关于我如何在 JWT 中使用通配符,除非?的主要内容,如果未能解决你的问题,请参考以下文章

在条件表达式中常用的通配符都有哪些,"like"代表啥含义

如何在输入输出中正确使用通配符

如何在类路径中使用通配符来添加多个 jar? [复制]

Spark Scala:如何在 LIKE 语句中使用通配符作为文字

如何使用 LIKE 通配符在列中搜索(不区分大小写)?

如何在 wordpress 帖子内容中使用通配符删除字符串?