我正在对基于SAML的单点登录(SSO)的开源implementations进行逆向工程
当SSO成功时,我从我的idp(身份提供者)获得POST并调用以下函数:
router.post('/acs/:idp?', function (req, res, next) {
console.log('got a post from idp');
var _idp, _sp;
if (req.params.idp === 'onelogin') {
console.log('the idp is onelogin or vidm in this case');
_idp = oneLoginIdP;
_sp = olsp;
} else {
_idp = idp;
_sp = sp;
}
_sp.parseLoginResponse(_idp, 'post', req, function (parseResult) {
console.log('trying to parse assertion to see if it is valid');
console.log('name id'+parseResult.extract.nameid);
if (parseResult.extract.nameid) {
res.render('login', {
title: 'Processing',
isSSOLogin: true,
email: parseResult.extract.nameid
});
} else {
req.flash('info', 'Unexpected error');
res.redirect('/login');
}
});
});
现在,我们可以看到这个函数在serverivceprovider对象(_sp)上调用了一个名为parseLoginResponse的函数。 parseLoginResponse如下所示:
ServiceProvider.prototype.parseLoginResponse = function parseLoginResponse(idp, binding, req, parseCallback) {
return this.abstractBindingParser({
parserFormat:
[
{
localName: 'StatusCode',
attributes: ['Value']
},
{
localName: 'Conditions',
attributes: ['NotBefore', 'NotOnOrAfter']
},
'Audience',
'Issuer',
'NameID',
{
localName: 'Signature',
extractEntireBody: true
},
{
localName: {
tag: 'Attribute',
key: 'Name'
},
valueTag: 'AttributeValue'
}
],
checkSignature: this.entityMeta.isWantAssertionsSigned(),
from: idp,
supportBindings: ['post'],
parserType: 'SAMLResponse',
actionType: 'login'
}, binding, req, idp.entityMeta, parseCallback);
};
我的三个具体问题:
How is the callback working for parseCallback method.
I am new to javascript so I don't get at which exact line parseCallback is receiving it's argument i.e parseResult?
我可以在parseCallback中成功打印以下行:
console.log('name id'+parseResult.extract.nameid);
但是我无法找到一种方法来打印包含不在之前和之后的属性。 How can I print attributes section of parseResult or the commplete parseResult argument?
答案 0 :(得分:3)
方法this.abstractBindingParser();
采用5个参数。最后一个 - parseCallback
功能。所以你在this.abstractBindingParser()
内传递这个函数。它将在this.abstractBindingParser()
内部调用;
您不知道内部调用的具体方式,哪些参数传递给parseCallback
。您可以参考您使用的系统的文档,也可以使用魔术变量arguments
。在console.log(arguments);
console.log('name id' + parseResult.extract.nameid);