У меня уже давно есть эта проблема. Я пытаюсь добавить кнопку «Войти через Steam», которая при входе в систему не только извлекает идентификатор пользователя, но и проверяет подпись. Steam использует OpenID 2.0.
Я следил за документацией здесь. Я тщательно следовал этим шагам, потратив большую часть своего дня на попытки понять это. Мой код таков:
let s = data['openid.signed'].split(',');
let x = Buffer.from(s.map(x => `${x}:${data['openid.' + x]}`).join('\n') + '\n', 'utf8');
let c = crypto.createHash('sha1').update(x).digest('base64');
console.log(x.toString('utf8')); // This is the key:value string
console.log(c); // This is the final result; the generated signature
Где данные — это ответ, полученный от провайдера OpenID. Регистрация x
(строка пары ключ:значение) дает ожидаемый результат:
signed:signed,op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle
op_endpoint:https://steamcommunity.com/openid/login
claimed_id:https://steamcommunity.com/openid/id/765611981[1234567]
identity:https://steamcommunity.com/openid/id/765611981[1234567]
return_to:http://127.0.0.1:8000/resolve
response_nonce:2018-12-01T17:53: [some_hash]=
assoc_handle:1234567890
Однако мой сгенерированный хэш c
не соответствует данной подписи openid.sig
. Обратите внимание, что я использую \n
в конце приведенной выше строки пары ключ:значение, поскольку именно так я интерпретировал документацию.
Примечание. Причина, по которой мне нужна аутентификация, заключается в том, что я хочу связать учетную запись Steam с учетной записью на своем веб-сайте, а вход через Steam дает вам полный доступ к вашей учетной записи на моем веб-сайте, что означает, что Крайне важно, чтобы пользователь не мог просто ввести идентификатор другого пользователя и получить доступ к своей учетной записи (атака с повтором). Из-за этого мне нужно как-то проверить подпись.
Я никогда раньше не работал с OpenID, так что извините за мои глупые ошибки. Я настоятельно рекомендую прочитать документацию, указанную выше, чтобы вы могли убедиться, что я делаю правильно.
С уважением,
crypto.createHmac('sha1', 'SteamAPIKey32Chars').update(x).digest('base64');
, но она все еще не дает предполагаемого хэша. - person troffaholic   schedule 02.12.2018