В настоящее время я использую аутентификацию OpenID для веб-сайта. Во время тестирования я заметил, что Google принимает разные версии заявленных идентификаторов профиля Google, например:
- http://www.google.com/profiles/stefan.fussenegger
- http://profiles.google.com/u/0/stefan.fussenegger/about
- https://profiles.google.com/stefan.fussenegger
- https://profiles.google.com/stefanfussenegger
Интересно, что проверенный идентификатор также отличается (для образцов выше, того же порядка):
- http://www.google.com/profiles/stefan.fussenegger
- https://profiles.google.com/stefanfussenegger
- https://profiles.google.com/stefan.fussenegger
- https://profiles.google.com/stefanfussenegger
Конечно, это затрудняет поиск связанной учетной записи пользователя, не говоря уже о невозможности. Интересно, что все вышеприведенные идентификаторы работают для Stackoverflow. Поэтому я подумал, что в моей реализации должен быть какой-то нормализационный шаг, который мне не хватает - или SO делает некоторые специализированные вуду, чтобы все было в порядке.
Глядя на 7.2 Нормализация спецификации проверки подлинности OpenID Я нашел это:
Идентификаторы URL ДОЛЖНЫ затем быть нормализованы при следующих перенаправлениях при получении их контента и, наконец, применении правил в Разделе 6 из [RFC3986] к конечному целевому URL. Этот конечный URL ДОЛЖЕН быть отмечен Стороной-доверяющей стороной в качестве Идентифицированного Идентификатора и использоваться при запросе аутентификации.
После перенаправления заявленных идентификаторов это не слишком помогает, так как я все еще остаюсь с двумя разными идентификаторами:
Глядя на переадресацию проверенных идентификаторов, гораздо полезнее, хотя я всегда получаю следующее:
Хорошо, похоже, я должен следовать переадресации проверенных идентификаторов, а не заявленных идентификаторов.
Теперь вопрос: безопасно ли следовать переадресации заявленных/проверенных идентификаторов, например. перед поиском DB так:
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;
Если да, я подозреваю, что это нужно делать не только при поиске пользователя, но и при сохранении нового идентификатора, правильно?
(Если мне действительно нужно следовать переадресации, у меня есть еще один вопрос о возможных вредоносных перенаправлениях, но мне придется подождать, пока я получу ответ на этот вопрос. Возможно, все равно устареет)