Как и когда следует перенаправлять OpenID?

В настоящее время я использую аутентификацию OpenID для веб-сайта. Во время тестирования я заметил, что Google принимает разные версии заявленных идентификаторов профиля Google, например:

Интересно, что проверенный идентификатор также отличается (для образцов выше, того же порядка):

Конечно, это затрудняет поиск связанной учетной записи пользователя, не говоря уже о невозможности. Интересно, что все вышеприведенные идентификаторы работают для 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;

Если да, я подозреваю, что это нужно делать не только при поиске пользователя, но и при сохранении нового идентификатора, правильно?

(Если мне действительно нужно следовать переадресации, у меня есть еще один вопрос о возможных вредоносных перенаправлениях, но мне придется подождать, пока я получу ответ на этот вопрос. Возможно, все равно устареет)

Ответ 1

Open ID 2.0 говорит, что во время обнаружения

Идентификаторы URL ДОЛЖНЫ затем быть нормализованы при следующих перенаправлениях при получении их контента и, наконец, применении правил в Разделе 6 из [RFC3986] к конечному целевому URL. Этот конечный URL ДОЛЖЕН быть отмечен Стороной-доверяющей стороной в качестве Идентифицированного Идентификатора и использоваться при запросе аутентификации.

Итак, в соответствии с этим вы должны взять предоставленный пользователем идентификатор и нормализовать его, следуя переадресации и следуя нормальным процедурам нормализации URL.

Результат считается "заявленным идентификатором" (CI). Затем вы выполните танцы ассоциации и определите, верно ли это утверждение.

Примечание. Некоторые поставщики имеют "хорошо известный" URL-адрес поставщика OpenId (OP), например Google. Если вы заметили процесс входа в систему для StackOverflow, вы можете просто нажать кнопку Google вместо заполнения формы. В этом варианте "хорошо известный" URL OP не является пользовательским CI. Пользователь не предоставил вам CI. Вам нужно подождать, пока вы не закончите танец аутентификации, и Google сообщит вам, кто является пользователем.

В этот момент (после получения успешной связи от провайдера OpenId) у вас будет идентификатор для пользователя. В разделе раздел 9.1 вы получите либо оба openid.claimed_id, и openid.identity, либо ни одно поле, если вы делаете что-то необычное с расширениями (I "не очень хорошо знаком с этим аспектом спецификации).

Теперь вы должны сохранить openid.claimed_id на своем конце - это будет идентификатор, уникальный для этого пользователя. Это может отличаться от того, что первоначально предоставил вам пользователь. Он также может отличаться от того, где вы оказались (после перенаправления по предоставленному пользователем идентификатору). Провайдер OpenID имеет последнее слово.

В отношении безопасности следующих переадресаций на пользовательский идентификатор. Здесь не должно быть проблем. Перенаправления позволяют пользователю делегировать аутентификацию поставщику по их выбору. Независимо от того, куда вас направляют перенаправления, вы в конечном итоге попросите провайдера OpenId установить связь с вами. Когда вы сделаете этот запрос, вы предоставите (нормализованный) заявленный идентификатор, и поставщик может решить, хотят ли они отвечать за заявленный идентификатор, и они (каким-то образом в своей бесконечной мудрости) утверждают, что пользователь имеет право владения этим заявленным идентификатор.

Возвращаясь к Google, заявленный идентификатор Google в конечном итоге будет поставляться, вы не будете похожи на ваши примеры выше. В качестве примера используется openid.claimed_id=https://www.google.com/accounts/o8/id/id=AItOawl27F2M92ry4jTdjiVx06tuFNA (источник).

Надеюсь, что это поможет...