passport.js - passport-saml - express - 重定向的 url 未提交表单导致 SAML 断言尚未生效
问题描述
下面是我今天在控制台上遇到的错误,而不是昨天相同代码运行良好的错误。
Error: SAML assertion not yet valid
at SAML.checkTimestampsValidityError
我已经验证我从IDP收到了成功,因此应用程序被重定向到配置文件中提到的 URL 中的“/home”端点。
此外,当我提交表单时,在自动重定向后 [显示内部服务器错误]
我按下浏览器的刷新按钮并提交表单并达到预期的结果。
我的问题是,为什么这不会自动发生,或者我可以如何以及在哪里以编程方式进行此提交。
护照.js
const SamlStrategy = require('passport-saml').Strategy;
module.exports = function (passport, config) {
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
passport.use(new SamlStrategy(
{
entryPoint: config.passport.saml.entryPoint,
issuer: config.passport.saml.issuer,
cert: config.passport.saml.cert,
path: config.passport.saml.path,
identifierFormat: config.passport.saml.identifierFormat
},
function (profile, done) {
debugger;
return done(null,
{
sessionIndex: profile.sessionIndex,
nameID: profile.nameID,
lastName: profile.lastName,
firstName: profile.firstName,
gid: profile.gid,
county: profile.county,
mail: profile.mail,
companyUnit: profile.companyUnit,
preferredLanguage: profile.preferredLanguage,
orgCode: profile.orgCode,
email: profile.email
});
})
);
};
配置.js
module.exports = {
passport: {
strategy: 'saml',
saml: {
callbackUrl: '/home',
path: '/home',
entryPoint: 'https://.../GetAccess/Saml/IDP/SSO/Unsolicited?GA_SAML_SP=APP',
issuer: '...',
cert: '...',
identifierFormat: null
}
}
};
应用程序.js
import express from 'express';
import helmet from 'helmet';
import cookieParser from 'cookie-parser';
import bodyparser from 'body-parser';
import path from 'path';
import logger from 'morgan';
import cors from 'cors';
import passport from 'passport';
import session from 'cookie-session';
const config = require('./config.js');
require('./passport')(passport, config);
var app = express();
app.use(logger('dev'));
app.use(cookieParser());
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({ extended: false }));
app.use('/public', express.static(path.join(__dirname, '../public')));
app.use('/data', express.static(path.join(__dirname, '../uploads/')));
app.use(session(
{
resave: true,
saveUninitialized: true,
secret: 'secret value'
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(helmet());
app.use(cors());
require('../router/routeConfig')(app, config, passport);
module.exports = app;
routeConfig.js
module.exports = function (app, config, passport) {
app.get('/', passport.authenticate(config.passport.strategy, {
successRedirect: '/home',
failureRedirect: 'https://.../GetAccess/Saml/IDP/SSO/Unsolicited?GA_SAML_SP=APP'
}));
app.get('/app', passport.authenticate(config.passport.strategy, {
successRedirect: '/home',
failureRedirect: 'https://.../GetAccess/Saml/IDP/SSO/Unsolicited?GA_SAML_SP=APP'
}));
app.post(config.passport.saml.path,
passport.authenticate(config.passport.strategy,
{
failureRedirect: 'https://.../GetAccess/Saml/IDP/SSO/Unsolicited?GA_SAML_SP=APP',
failureFlash: true
}),
function (req, res) {
debugger;
res.sendFile(path.join(__dirname, "../public/index.html"));
});
};
解决方案
如上所述,将 'acceptedClockSkewMs: -1' 添加到您的 passport-saml 策略配置可以解决错误。
例子:
const strategy = new SamlStrategy(
{
path: "/api/auth/callback",
entryPoint: process.env.SAML_ENTRY_POINT, // identity provider entrypoint
issuer: issuer,
cert: process.env.SAML_CERT,
acceptedClockSkewMs: -1 // SAML assertion not yet valid fix
}, function(profile, done){...}
推荐阅读
- sql-server - 如何从 SSIS 中的平面文件更新表,但如果源为空白则不更新字段?
- python - 为什么 b[:]=a 会改变列表 b?
- vue.js - 在 Vue.js 中使用此脚本的最佳方式是什么?
- php - 如何组织一个不寻常的连接 OneToOne Doctrine2
- xml - 过滤所有月份特定日期的事件日期 xsd
- kentico - 如何使用 Kentico Rest API 将联系人添加到联系人组?
- python - 如何将批量数据发布到弹性搜索?
- mysql - Laravel 5.7 中修改的用户注册停止工作(字段'last_name'没有默认值,但数据完整)
- azure-devops - 不遵守 Azure Pipelines 任务超时
- python - 是否可以从虚拟环境中运行 jupyter