在Node中使用saml2-js发送一个SAML请求



我已经阅读了连接到IDP的文档(尽管有限)。一切都配置好了,除了一件事。IDP不接受通过GET的SAML请求。

saml2-js是否支持HTTP POST向IDP发送SAML请求,如果是的话,这是如何编码的?如果没有,是否有其他可用的NPM包?

目前我有:

sso.sp.create_login_request_url(sso.idp,{},(err, login_url, requestId) => {
console.log('err',err)
console.log('login_url',login_url)
console.log('requestId',requestId);
response.redirect(login_url);
});

jsub的回答:

对IdP的POST请求必须由浏览器发出,而不是由服务器发出(在jsub的情况下由needle发出)。只有浏览器包含使用IdP对用户进行身份验证的IdP会话cookie。res必须包含一个自动提交<form>的HTML页面,每个param都有一个<input>:

app.get("/login", function(req, res) {
sso.sp.create_login_request_url(sso.idp, {}, function(err, login_url, requestId) {
var url = new URL(login_url);
res.type("html");
res.write(`<!DOCTYPE html><html>
<body onload="document.querySelector('form').submit()">
<form action="${url.protocol}//${url.host}${url.pathname}" method="post">`);
for (const [param, value] of url.searchParams)
res.write(`<input name="${param}" value="${value}"/>`);
res.end(`</form></body></html>`);
});
});

我也在努力解决这个问题,我的尝试没有奏效,但方法是与客户端(在我的情况下使用针)进行单独的http POST请求,然后尝试将响应从该响应管道到处理程序的响应,例如:

sso.sp.create_login_request_url(sso.idp, {}, (err, login_url, requestId) => {
// response.redirect(login_url);
const [url, param] = login_url.split("?")
const postOptions = {
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}
needle.post(Url, param, postOptions, (err, postResponse) => {
postResponse.pipe(res) 
});

然而,我没有太多的运气,试图挖掘为什么管道不工作

编辑:管道似乎工作时,我做这个简短的形式

needle.post(url, param, postOptions).pipe(res)

最新更新