Вопрос поставщика OpenID: как указать идентификатор, отличный от заявленного идентификатора конечного пользователя

Я использую библиотеку JanRain и реализую код, очень похожий на пример их сервера (по сути, создавая свой собственный провайдер openid). У меня он работает, но когда я пытаюсь вернуть идентификатор, отличный от указанного потребителю, я получаю следующую ошибку:

Запрос был для http://example.com/, невозможно ответить с идентификацией http://example.com/openid/33

В этом случае уникальный идентификатор / URL - это http://example.com/openid/33, а для потребителя - http://example.com.

Я использую что-то вроде этого:

$request  =  $server->decodeRequest();
$request->answer( true, null,  $id_url, $request->identity );

Я пробовал переключаться между $request->identity и $id_url. Я получаю ошибку только в показанном выше состоянии, а другое состояние работает, но, похоже, не возвращает потребителю то, что нужно. Я использую тест OP Simple Registration, который можно найти здесь: http://test-id.org/OP/Sreg.aspx, и когда я их переключаю, он работает, но я нигде не могу найти свой $id_url в журналах.

Я предполагаю, что мне нужно сообщить потребителю что-то раньше в процессе об идентификаторе, отличном от идентификатора, указанного конечным пользователем, но пока я не нашел правильного решения, чтобы попробовать. Я знаю, что это возможно, потому что так работает OpenID Yahoo.

Любые идеи и предложения приветствуются. Спасибо!


person livingtech    schedule 31.08.2010    source источник


Ответы (1)


Вы путаете URL-адрес конечной точки с заявленным идентификатором или локальным идентификатором OP.

Рабочий процесс такой:

  • Пользователь вводит идентификатор, предоставленный пользователем
  • Consumer performs discovery on it and and then it will either have:
    • The provider endpoint URL/version. In this case, the claimed identifier/op-local identifier will be http://specs.openid.net/auth/2.0/identifier_select
    • URL-адрес конечной точки поставщика, версия протокола, заявленный идентификатор (идентификатор, предоставленный пользователем) и локальный идентификатор OP.

Таким образом, вы должны предоставлять новый идентификатор, только если у вас есть http://specs.openid.net/auth/2.0/identifier_select.

person Artefacto    schedule 31.08.2010
comment
Итак, в моем случае конечная точка находится в http://example.com/openid, и я указывал это с помощью <link rel="openid2.provider openid.server" href="http://example.com/openid/"/>. Следует ли мне также разместить <link rel="openid2.local_id openid.delegate" href="http://specs.openid.net/auth/2.0/identifier_select" /> на этой странице? Я попробую это сейчас. (И должен ли я также заменить это фактическим идентификатором, если он известен? IE, если мой пользователь уже вошел в систему?) - person livingtech; 31.08.2010
comment
@livin Так нельзя. Спецификация OpenID 2.0, раздел 7.3.3 Обнаружение на основе HTML можно использовать только для обнаружения заявленных идентификаторов. Вы должны использовать XRDS. - person Artefacto; 31.08.2010
comment
@Artefacto Хммм ... Я уже пишу заголовок, который указывает на очень простой (статический) документ XRDS с тегом <Service>, содержащий только теги <TYPE> и <URI>. Если я добавлю <LocalID>http://specs.openid.net/auth/2.0/identifier_select</LocalID> в этот документ, это сработает? Есть ли какой-нибудь момент (после открытия), где используется XRDS, и он должен быть другим? Кстати, спасибо за вашу помощь. - person livingtech; 31.08.2010
comment
@livingtech: Нет, не пойдет. Вам вообще не следует указывать LocalID, просто используйте http://specs.openid.net/auth/2.0/server вместо http://specs.openid.net/auth/2.0/signon в теге <Type>. См. Подробности в разделе 7.3.2.1 спецификации. - person Mewp; 31.08.2010
comment
Спасибо @Mewp, похоже, что я указывал здесь не то, но я ВСЕ ЕЩЕ получаю исходную ошибку. Request was for http://example.com/, cannot reply with identity http://example.com/openid/33 - person livingtech; 31.08.2010
comment
@livingtech: вы уверены, что настроили библиотеку для использования identifier_select? (что я понятия не имею, как делать с этой библиотекой) - person Mewp; 31.08.2010
comment
@Mewp, я точно НЕ уверен. Оказывается (просматривая код библиотеки), я не должен получать эту ошибку, если запрос указывает http://specs.openid.net/auth/2.0/identifier_select, поэтому каким-то образом запрос потребителя имеет http://example.com в качестве идентификатора, указанного в нем. Думаю, возникает вопрос ... это моя вина как-то? - person livingtech; 31.08.2010
comment
@livingtech: когда RP встречает документ XRDS с <Type>http://specs.openid.net/auth/2.0/server</Type>, он должен отправить как claimed_id, так и identity значение http://specs.openid.net/auth/2.0/identifier_select. Если он установлен на http://example.com, то во время обнаружения может быть проблема. Возможно, вы неправильно определили X-XRDS-Location, и RP вернулся к обнаружению HTML? - person Mewp; 31.08.2010
comment
Это полезная информация, спасибо. Вот мой документ XRDS: <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)"><XRD><Service priority="0"><Type>https://specs.openid.net/auth/2.0/server</Type><URI>http://example.com/openid</URI></Service></XRD></xrds:XRDS> (Извините за форматирование ...) Вам это нравится? Другой вопрос: мой базовый домен на самом деле не печатает заголовок XRDS. Только моя конечная точка делает это (http://example.com/openid) ... не слишком ли поздно? (Это могло быть моей проблемой с самого начала.) - person livingtech; 01.09.2010
comment
Похоже, это не было моей проблемой, так как я пытался просто использовать свою конечную точку в качестве заявленного идентификатора, но все равно получаю сообщение об ошибке. - person livingtech; 01.09.2010
comment
@livingtech: Да, вы должны включить заголовок на основном сайте - иначе как RP узнает, где находится документ XRDS? Сам документ мне нравится. Попробуйте удалить теги html, чтобы невозможно было выполнить обнаружение html - тогда вы увидите, найден ли и прочитан ли документ XRDS RP. - person Mewp; 01.09.2010
comment
Принимаю этот ответ, хотя моя первоначальная проблема все еще не решена. Спасибо всем за помощь. - person livingtech; 08.09.2010