Я реализовал провайдера OpenID 1.1 на Java, но у меня проблемы со смарт-клиентами, используя assoc_handle
от associate
, придумывая разные подписи. Тупые клиенты, полагающиеся на check_authentication
, отлично работают. В частности, я тестирую против LiveJournal и продолжает возвращаться:Как сгенерировать OpenID 1.1 sig на основе assoc_handle?
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
является base64-декодируются версия mac_key
возвращается на первоначальном associate
вызова (например, извлеченного с помощью secret(assoc_handle)
согласно спецификации). Я провел достаточное количество тестов, чтобы убедиться, что enc_mac_key
можно дешифровать правильно.
Любые мысли? Есть ли что-то в этом роде?
Или ... есть простой, автономный клиент, который знает, кто будет делать OpenID 1.1 и отслеживать его шаги. Учитывая, что я могу понять, где я вычисляю вещи по-разному.