2016的时候曾经较全的过了一次公司常见的SSO的技术概念,但真正用的也就两次,一次是nodejs,一次是python

nodejs 使用到的是一个叫做httpntlm的库,由于不喜欢把密码(虽然是应付公司开机的密码)代码里面,所以提交了一次pull request,神奇的比利时作者竟然鸟我。

'use strict'
var httpntlm = require('httpntlm');
var ntlm = httpntlm.ntlm;
function startCrawler() {
    //use below method to generate encrypted password
    //用下面两个API去分别使用两个算法去加密你的密码,最后会得到两个Buffer,存下来,以后直接可以调用
    // var lm = ntlm.create_LM_hashed_password('');
    // console.log(Array.prototype.slice.call(lm, 0));//print out the encrypted password array
    // var nt = ntlm.create_NT_hashed_password('');
    // console.log(Array.prototype.slice.call(nt 0));//print out the encrypted password array

    //save the array into below
    var lm = new Buffer([183, 180, 19, 95, 163, 5, 118, 130, 30, 146, 159, 252, 1, 57, 81, 39]);
    var nt = new Buffer([150, 27, 7, 219, 220, 207, 134, 159, 42, 60, 153, 28, 131, 148, 14, 1]);

    httpntlm.get({
                     url: "url",
                     username: 'username',
                     lm_password: lm,
                     nt_password: nt,
                     workstation: 'eu',
                     domain: 'XXXDM'
                 }, function (err, res) {
        if (err) {
            return err;
        } else {
            preProcess(res.body);
        }

    });
};

还有一次是python去做页面解析的工作,用到了requests这个非常出名的库

import requests
        r = requests.get(
            'http://xxx.com/index.php?search=[content]&title=Special%3ASearch&go=Go'.replace('[content]',   content),
            auth=HTTPBasicAuth(user_name, pwd))
            wiki_html = r.text

其实难度不高,重点是知道究竟那种验证,因为有时候搜索关键字并不准确的,另外一点就是找到能够用到的库。

关于怎么判断是哪一种验证,可以参考stackoverflow里面的例子