1.Kerberos的認證體系
Kerberos是希臘神話中的地獄三頭犬,熟悉希臘神話,或者看過哈利波特1的朋友可能見過這個形象。MIT的一個認證服務體系,也用了這個名字,并且用一個短劇的形式很好的說明了這個系統(tǒng)——這個短劇,直到最后兩段話之前,我都很好的理解了……最后功虧一簣,還在看。
這個認證系統(tǒng)是為了向服務器證明,你是你(而不是一個偽裝成你的人)的一個體系。
基于這個系統(tǒng),在*Nix下,有一套命令,在MIT那邊也有詳細的API。
2.遇到的問題
我最近在對接一套API,用同事的話來說,非常的tricky。在使用HTTP請求調用之前,你需要在命令行里運行kinit命令,輸入你的密碼進行一次身份校驗。然后在請求中,使用negotiate的方式進行請求,server在多次握手的過程中,讀取你的校驗token,完成驗證。
那么問題來了,Kinit的token,有效期是10H,也就是如果你想讓server持續(xù)的能夠調取API,就必須每隔10H左右,登錄它,進行身份校驗。這不是開玩笑么。我們尊貴的用戶,怎么能做這種明顯可以自動登錄的事情呢。
于是我就需要一套自動登錄的小程序。
3.解決過程
Kinit無密碼登錄,其實不是什么新鮮事。哪怕在百度上,也有人提出過:只要使用ktutil這個命令(included in the command-set I mentioned above),就可以生成一個.keytab文件,下次運行kinit登錄時,就只需要提供keytab文件了。然而問題來了,我用的是OS X,這套命令,不一樣!
于是我就又想簡單粗暴的在控制臺自動輸入這個密碼。Nodejs其實也有stdin的接口。不過我發(fā)現(xiàn)kinit這個命令是在stderr中提示輸入密碼,我本來試圖用stderr的監(jiān)聽事件來進行進行stdin的write和close,也失敗了。
于是我返回了第一種方法。既然命令格式不對而非命令不執(zhí)行,還是有可能的,恰逢此時我的兩封求救信都無功而返,于是我開始查man page,結果倒是發(fā)現(xiàn)了一些方法,然而除了讓我更好的使用Ktutil這個工具之外,倒是沒有很大幫助。
天無絕人之路,我在此在網上搜索時,一篇文章映入眼簾,是Apple論壇對Kinit的討論,隨后我去論壇繼續(xù)搜,不一會兒就找到了這個——https://discussions.apple.com/message/28414767#28414767
4.解決方案與遺留問題
于是,解決方案如下,使用kinit+你的完整賬號登錄,如果是你的本機用戶,也可以直接kinit。
之后運行
```
security add-generic-password -a "你的名字" -l "服務器 (你的名字)" -s "服務器" -w '密碼' -c "aapl" -T "/usr/bin/kinit"
```
即可。
在OS X下,會提示存儲和使用Keychain,同意即可。
遺留問題:
我后來想到了,stdin可以監(jiān)聽readable事件,可以在里面進行輸入,或許可以解決這個問題。然而我已經配置好了,等下次遷移環(huán)境的時候再測試吧。