OpenID Simple Registration (sreg) против обмена атрибутами (ax)

Какова связь между расширениями OpenID sreg и ax? Как полагающаяся сторона знает, какой из них запрашивать, или и то, и другое?

Ответ 1

sreg был написан как простая вещь, которая могла бы работать, и имеет очень ограниченный набор доступных полей. Но поскольку это включает nickname, email и fullname, это часто все, что вам нужно.

Атрибут Exchange гораздо более расширяемый и функциональный, хотя я подозреваю, что на практике такие функции, как update_url и запрос на хранение, не были широко реализованы.

Что касается того, что нужно запрашивать: теоретически, какие расширения, поддерживаемые провайдером, документируются в документе XRDS, доступном на этапе обнаружения, как отмечено в Extensions в спецификации. Если вы используете python-openid (или, возможно, одну из других библиотек в OpenID Enabled), вы можете запросить это через что-то вроде

auth_req = consumer.begin('http://example.com/joe')

from openid.extensions import sreg

if sreg.supportsSreg(auth_req.endpoint):
    sreg_request = sreg.SRegRequest(required=['nickname','email'])
    auth_req.addExtension(sreg_request)
else:
    # maybe AX, maybe something else...

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

Кроме того, даже если вы получаете XRDS, который рекламирует расширение AX, насколько я знаю, он не сообщает вам, какие атрибуты поддерживает провайдер (т.е. какая схема AX).

Самый практичный подход - это, вероятно, попросить много вещей, и если вы вернете некоторые вещи, вы можете его использовать.