根據(jù)express-jwt官方說明文檔庆猫,我們可以在總路由上加上jwt驗(yàn)證认轨,同時在那些不想加驗(yàn)證的路由上使用unless
去除驗(yàn)證,如下:
app.use(jwt({ secret: 'shhhhhhared-secret'}).unless({path: ['/token']}));
這樣就不用每條路由挨個去加jwt驗(yàn)證了月培,方便了不少嘁字。但是在使用過程中發(fā)現(xiàn)一個問題:這個unless
無法區(qū)分http-method, 那么象以下這樣的路由:
router.route('/')
/** GET /api/users - Get list of users */
.get(userCtrl.list)
/** POST /api/users - Create new user */
.post(validate(paramValidation.createUser), userCtrl.create);
我只想在路由的get方法上做驗(yàn)證,post方法時注冊方法杉畜,不能添加驗(yàn)證(否則就無法注冊了)纪蜒。像這樣的官網(wǎng)沒有說明,google全網(wǎng)也沒有找到解決方法此叠。最后還是翻源碼找到了解決方法:
在express-jwt源碼的index.js文件中找到這樣一句:
var unless = require('express-unless');
...
/*express-jwt/index.js*/
middleware.unless = unless;
說明它用的是express-unless
,再看package.json
,也證實(shí)了這一點(diǎn)
/*express-jwt/package.json*/
"dependencies": {
"async": "^1.5.0",
"express-unless": "^0.3.0",
"jsonwebtoken": "^8.1.0",
"lodash.set": "^4.0.0"
},
上express-unless repo找到示例:
app.use(requiresAuth.unless({
path: [
'/index.html',
{ url: '/', methods: ['GET', 'PUT'] } //正是我需要的纯续!
]
}))
最后完成:
app.use(
"/api",
jwt({ secret: config.jwtSecret }).unless({
path: [
{ url: '/api/auth/login', methods: ['POST']},
{url: '/api/users', methods: ['POST']},
{url: '/api/test', methods: ['GET']}
]
}),
routes
);
問題解決,源碼是最權(quán)威的灭袁!