2016-11-11 51 views
0

我已經在Java中實現了一個OpenID 1.1提供程序,但是我使用associateassoc_handle提供了不同的簽名,因此智能客戶端遇到問題。愚蠢的客戶依靠check_authentication工作正常。具體來說,我正在測試針對的LiveJournal和它不斷返回:如何基於assoc_handle生成OpenID 1.1 sig?

signature_mismatch:此前聯想無效ID供應商的響應。

HMAC()功能的主體是:

public static byte[] HMAC(byte[] secret, String token_contents) { 
    SecretKey sk = new SecretKeySpec(secret, "HMACSHA1"); 
    Mac m = Mac.getInstance(sk.getAlgorithm()); 
    m.init(sk); 
    return m.doFinal(token_contents.getBytes("UTF-8")); 
} 

token_contents調用HMAC()處理的checkid_setup期間來自下面的代碼。也就是說,簽名是在mode,identity,return_to上完成的,這也是signed響應參數的值。

String token_contents = String.format(
    "mode:id_res\nidentity:%s\nreturn_to:%s\n", 
    identity, return_to); 

最後,secret是由初始associate呼叫(例如,經由secret(assoc_handle)檢索爲每規範)返回的mac_key的BASE64解碼版本。我做了相當數量的測試,以確保enc_mac_key可以正確解密。

有什麼想法?這有什麼明顯的錯誤嗎?

還是...有沒有一個簡單的,獨立的客戶端,任何人都知道哪些會做OpenID 1.1並追蹤其步驟。鑑於我可能能夠弄清楚我在計算事情的方式不同。

回答

0

在我的情況下,問題是使用base64url encoding輸出鍵值(mac_key,enc_mac_key,dh_server_public)而不是標準的base64。在Apache Commons我使用的是encodeBase64URLSafeString而不是簡單的encodeBase64String。這是一個不幸的結果,因爲之前在Open ID Connect中工作過,我誤解了函數的本質。

無論如何,幫助我發現答案的是使用簡單出色的OpenID4Java及其simple-openid JSP樣本。立即它刪除了我的簽名上的錯誤,抱怨它是168位(而不是160位)。