如何解决Angular Service Worker 缓存对包含 SAML2 对象的 POST 请求的 302 响应
根据我的理解,Angular Service Worker 不会/无法缓存 POST 请求。但是,我面临一个奇怪的问题。 我的应用程序提供 SSO,我们在其中与客户的 ADFS 系统集成并解析 SAML2 XML 响应。流量是
-
员工前往公司的 adfs 网站,登录并选择我们的应用
-
客户端服务器(身份提供者)向我们的服务器发送包含 saml2 响应的 POST 请求 - 启用了发布绑定
-
我们的服务器(服务提供商)解析响应,提取 XML,进行一系列安全测试,从属性中提取电子邮件,查询数据库以检查用户是否存在并发送
302
响应状态与位置作为我们应用程序的登录页面,并带有一些 URL 参数来指示成功状态。如果状态为成功,也可以设置 cookie
问题是当 Service Worker 被激活时,我第一次使用我的浏览器(最新的 Firefox 和 Chrome)时它可以工作,我可以在网络检查选项卡中看到 302
状态。 cookie 已设置,没有缓存头和登录按预期工作。该 API 的第二次状态代码为 200
,类型为“service worker”,我的服务器日志显示 API 甚至没有访问服务器 - 在第 3 点中讨论 API)将状态代码更改为 { {1}} 给出了相同的行为。
如果我从浏览器中禁用 Service Worker,请使用隐身模式或从 Angular 应用程序禁用 Service Worker,它会按预期工作。分享相关代码 -
Node 中 SSO 的回调 API
303
我已经看到一些 SO 答案谈论从 Service Worker 手动处理 // d is req.body here
const saml2Login = async (d,req,res,redirectResp) => {
const protocol = 'https://';
const saml2SuccessRedirect = `${protocol}${req.headers.host}?type=saml2LoginSuccess`;
const saml2FailureRedirect = `${protocol}${req.headers.host}?type=saml2LoginFail`;
if (!d.SAMLResponse) {
return redirectResp(`${saml2FailureRedirect}&code=162`);
}
const xml = base64ToAscii(d.SAMLResponse);
const saml2Response = await parseStringPromise(xml).catch((e) => {
console.log('saml2Login: error',e.message);
});
if (!saml2Response) {
return redirectResp(`${saml2FailureRedirect}&code=162`);
}
const {
root,samlStatus,issuer,assertion,version,destination,saml2Protocol,notBefore,notOnorAfter,x509Certificate,signature,attributes,} = parseSAML2Response(saml2Response['samlp:Response']);
const {
email,upn,firstName,lastName,} = attributes;
console.log('attributes',attributes);
// lot of security checks are done
// Check db using user email,return user
if (!user.enabled) {
return redirectResp(`${saml2FailureRedirect}&code=148`);
}
let token = jwtSign({ userId: user.userId,clientId: client.clientId },duration);
setToken(res,token,duration);
return redirectResp(`${saml2SuccessRedirect}&userId=${user.userId}`);
}
let redirectResp = (url) => {
// disable cache to ensure query params in the redirect work properly
res.writeHead(302,{ 'Location': url,'Content-Type': 'text/html','Cache-Control': 'private,no-cache,no-store,must-revalidate','Pragma': 'no-cache','Expires': 0 });
res.end();
}
const setToken = function(res,timeInSeconds) {
res.setHeader('Set-Cookie','x-myCompany-token=' + (token || '') + '; Domain=' + conf.host + '; Max-Age=' + timeInSeconds + ' HttpOnly; SameSite=Strict');
}
代码,但这些都是为了响应 GET 请求。我需要一些有关如何在不禁用 Service Worker 的情况下解决此重定向问题的指导。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。