试图理解Node回调语法

时间:2017-04-08 18:00:42

标签: javascript node.js

我正在对基于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);
    };

我的三个具体问题:

  1. How is the callback working for parseCallback method.

  2. I am new to javascript so I don't get at which exact line parseCallback is receiving it's argument i.e parseResult?

  3. 我可以在parseCallback中成功打印以下行:

    console.log('name id'+parseResult.extract.nameid);
    
  4. 但是我无法找到一种方法来打印包含不在之前和之后的属性。 How can I print attributes section of parseResult or the commplete parseResult argument?

1 个答案:

答案 0 :(得分:3)

方法this.abstractBindingParser();采用5个参数。最后一个 - parseCallback功能。所以你在this.abstractBindingParser()内传递这个函数。它将在this.abstractBindingParser()内部调用;

您不知道内部调用的具体方式,哪些参数传递给parseCallback。您可以参考您使用的系统的文档,也可以使用魔术变量arguments。在console.log(arguments);

之后放置console.log('name id' + parseResult.extract.nameid);