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).
Наиболее практичный подход, вероятно, состоит в том, чтобы запросить много вещей, и если вы получите что-то обратно, вы можете использовать его.