如何轻松地使用 Passport 身份验证测试 Node JS 应用程序?
How do you test a Node JS application with Passport authentication effortless?
虽然在 Node JS 应用程序中实现功能 "ensureAuthenticated" 以始终需要登录用户,并且还要求 Oauth2 登录需要 HTTPS 站点,但我需要每次都将我的应用程序部署到主机是时候我想测试一条路线了。如何在不浪费时间部署的情况下连续测试?
我实现了一个测试中间件,当我在本地 运行 并且我将环境变量设置为测试时,它允许我绕过身份验证。以下是代码示例:
我的设置
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const MongoStore = require('connect-mongo')(session);
const cookieParser = require('cookie-parser');
const testconfig = require('./config/testconfig');
const { ensureAuthenticated } = require('../config/auth');
然后典型的 ensureAuthenticated 方法在我的 auth.js
中看起来像这样
module.exports = {
ensureAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
req.flash('error_msg', 'Please log in to view this resource');
res.redirect('/');
}
}
这让我可以像这样以简单的方式创建路线:
router.get('/dashboard', ensureAuthenticated, function(req, res) {
res.render('dashboard', {name: req.user.id});
})
重要的是要注意我的特定护照实施为我提供了我正在使用的 req.user.id 变量,该变量标识当前登录的用户。
构建路由后,我现在被锁定并必须始终将我的解决方案部署到我的主机,在我的例子中 Herokuapps.com 它提供免费托管以供开发。
进行测试。
为了在本地绕过身份验证,我使用 dotenv npm 包来设置环境变量。我的 .env 文件如下所示:
NODE_ENV='test'
现在我可以实现自己的中间件了,你可能已经注意到了这一行:
const testconfig = require('./config/testconfig');
我使用的,这是 testconfig.js:
的代码
module.exports = function () {
return function (req, res, next) {
// Implement the middleware function based on the options object
if(process.env.NODE_ENV === 'test'){
req.user = {
id: 'testuser',
battletag:'testbattletag'
}
}
next()
}
}
我通过调用让应用程序使用它:
app.use(testconfig());
最后我将 ensureAuthenticated 方法编辑为:
module.exports = {
ensureAuthenticated: function(req, res, next) {
if(process.env.NODE_ENV === 'test'){
return next();
}
if (req.isAuthenticated()) {
return next();
}
req.flash('error_msg', 'Please log in to view this resource');
res.redirect('/');
}
}
一切就绪,准备就绪!现在我可以安心地使用 nodemon 在开发路线时立即看到变化,同时它们仍准备好用于生产。我需要做的就是在我的 .env 文件中将环境变量设置为类似 'production' 的内容,如下所示:
NODE_ENV='production'
虽然在 Node JS 应用程序中实现功能 "ensureAuthenticated" 以始终需要登录用户,并且还要求 Oauth2 登录需要 HTTPS 站点,但我需要每次都将我的应用程序部署到主机是时候我想测试一条路线了。如何在不浪费时间部署的情况下连续测试?
我实现了一个测试中间件,当我在本地 运行 并且我将环境变量设置为测试时,它允许我绕过身份验证。以下是代码示例:
我的设置
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const MongoStore = require('connect-mongo')(session);
const cookieParser = require('cookie-parser');
const testconfig = require('./config/testconfig');
const { ensureAuthenticated } = require('../config/auth');
然后典型的 ensureAuthenticated 方法在我的 auth.js
中看起来像这样module.exports = {
ensureAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
req.flash('error_msg', 'Please log in to view this resource');
res.redirect('/');
}
}
这让我可以像这样以简单的方式创建路线:
router.get('/dashboard', ensureAuthenticated, function(req, res) {
res.render('dashboard', {name: req.user.id});
})
重要的是要注意我的特定护照实施为我提供了我正在使用的 req.user.id 变量,该变量标识当前登录的用户。 构建路由后,我现在被锁定并必须始终将我的解决方案部署到我的主机,在我的例子中 Herokuapps.com 它提供免费托管以供开发。
进行测试。
为了在本地绕过身份验证,我使用 dotenv npm 包来设置环境变量。我的 .env 文件如下所示:
NODE_ENV='test'
现在我可以实现自己的中间件了,你可能已经注意到了这一行:
const testconfig = require('./config/testconfig');
我使用的,这是 testconfig.js:
的代码module.exports = function () {
return function (req, res, next) {
// Implement the middleware function based on the options object
if(process.env.NODE_ENV === 'test'){
req.user = {
id: 'testuser',
battletag:'testbattletag'
}
}
next()
}
}
我通过调用让应用程序使用它:
app.use(testconfig());
最后我将 ensureAuthenticated 方法编辑为:
module.exports = {
ensureAuthenticated: function(req, res, next) {
if(process.env.NODE_ENV === 'test'){
return next();
}
if (req.isAuthenticated()) {
return next();
}
req.flash('error_msg', 'Please log in to view this resource');
res.redirect('/');
}
}
一切就绪,准备就绪!现在我可以安心地使用 nodemon 在开发路线时立即看到变化,同时它们仍准备好用于生产。我需要做的就是在我的 .env 文件中将环境变量设置为类似 'production' 的内容,如下所示:
NODE_ENV='production'