В настоящее время я использую аутентификацию OpenID для веб-сайта. Во время тестирования я заметил, что Google принимает разные версии заявленных идентификаторов профиля Google, например:
Интересно, что подтвержденный идентификатор отличается от хорошо (для примеров выше в том же порядке):
Конечно, это затрудняет поиск связанной учетной записи пользователя, если не сказать невозможным. Интересно, что все вышеперечисленные идентификаторы работают для Stackoverflow. Поэтому я подумал, что должен быть какой-то этап нормализации, который мне не хватает в моей реализации - или SO делает какое-то специализированное колдовство, чтобы все прояснить.
Глядя на 7.2 Нормализация спецификации OpenID Authentication Я обнаружил this:
Идентификаторы URL ДОЛЖНЫ быть затем нормализованы как с помощью следующих перенаправлений при извлечении их контента, так и, наконец, с применением правил из Раздела 6 [RFC3986] к конечному URL назначения. Этот конечный URL ДОЛЖЕН быть отмечен Проверяющей стороной как Заявленный идентификатор и использоваться при запросе аутентификации.
Следующие перенаправления заявленных идентификаторов не очень помогают, поскольку у меня все еще остаются два разных идентификатора:
Просмотр перенаправлений проверенных идентификаторов гораздо полезнее, поскольку я всегда получаю следующее:
Ладно, похоже, я должен следовать перенаправлениям проверенных идентификаторов, а не заявленных идентификаторов.
Теперь вопрос: безопасно ли следовать перенаправлениям заявленных / проверенные идентификаторы, например перед поиском в БД следующим образом:
do {
user = lookup(verifiedId)
if (user is null)
response = fetchUrl(verifiedId)
if (response.location is null) {
break # no redirect, jump out of loop, unknown user
} else {
verifiedId = response.location # use redirect location
}
} while (user is null)
return user;
Если да, я подозреваю, что это следует делать не только при поиске пользователя, но и при сохранении нового идентификатора, верно?
(Если я действительно должен следовать перенаправлению, я есть еще один вопрос о потенциальных злонамеренных перенаправлениях, но мне придется подождать, пока я не получу ответ на этот. В любом случае может стать устаревшим)