У меня уже давно есть эта проблема.Я пытаюсь добавить кнопку Вход через 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, поэтому прошу прощения за любые мои глупые ошибки.Я настоятельно рекомендую прочитать документацию, которая приведена выше, чтобы вы могли убедиться, что я правильно делаю.
С уважением,