Синтаксический анализ XML-клиента rubycas
При использовании CAS-клиента, следуя инструкциям, я достиг положительного ответа от внешнего сервера CAS:
CAS server responded with #<Net::HTTPOK 200 OK readbody=true>:
И XML выглядит так:
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:attributes>
<cas:user>4oaz8QMucIrlFOU7dr3QpWkqbRY=</cas:user>
<cas:ccc></cas:ccc>
<cas:tipo>EDITED_OUT</cas:tipo>
<cas:acceso>cd</cas:acceso>
<cas:identificador>EDITED_OUT</cas:identificador>
<cas:txtBienvenida>EDITED_OUT</cas:txtBienvenida>
<cas:usuarioValidado>S</cas:usuarioValidado>
<cas:correo>EDITED_OUT</cas:correo>
<cas:tlf>EDITED_OUT</cas:tlf>
<cas:tipoAcceso>2</cas:tipoAcceso>
<cas:xusuario>EDITED_OUT</cas:xusuario>
<!-- En caso de que el usuario disponga de certificado digital -->
<cas:nif>EDITED_OUT</cas:nif>
<cas:email>EDITED_OUT</cas:email>
<cas:apellido1>EDITED_OUT</cas:apellido1>
<cas:apellido2>EDITED_OUT</cas:apellido2>
<cas:anagramaFiscal>EDITED_OUT</cas:anagramaFiscal>
<cas:nombre>EDITED_OUT</cas:nombre>
<!-- Faltan las fechas -->
<cas:tipoCertificado>EDITED_OUT</cas:tipoCertificado>
<cas:emisor>EDITED_OUT</cas:emisor>
<cas:usoCertificado>EDITED_OUT</cas:usoCertificado>
<cas:apellidosResponsable>EDITED_OUT</cas:apellidosResponsable>
<!-- Faltan las fechas -->
<cas:politica>1.3.6.1.4.1.5734.3.5</cas:politica>
<cas:subject>EDITED_OUT</cas:subject>
<cas:versionPolitica>45</cas:versionPolitica>
<cas:organizacionEmisora>FNMT</cas:organizacionEmisora>
<cas:idPolitica>DEFAULT</cas:idPolitica>
<cas:numSerie>EDITED_OUT</cas:numSerie>
<cas:clasificacion>FNMT</cas:clasificacion>
<cas:tipoAfirma>0</cas:tipoAfirma>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse>
Затем я получаю это сообщение от rubycas-client:
Ticket "EDITED_OUT" for service "EDITED_OUT" belonging to user nil is VALID.
И тогда эта ошибка сброса:
TypeError (can't dup NilClass):
org/jruby/RubyKernel.java:1894:in `dup'
----CUTTED----
Изучив код, я пришел к выводу, что ошибка находится в строке filter.rb 64:
controller.session[client.username_session_key] = st.user.dup
При отладке я изучил содержимое st- объекта:
(rdb:2) st.is_valid?
true
(rdb:2) st.user
nil
(rdb:2) st
#<CASClient::ServiceTicket:0x7e054262
@renew=nil,
@extra_attributes={
"user"=>"4oaz8QMucIrlFOU7dr3QpWkqbRY="
"ccc"=>nil,
"tipo"=>"CIUDADANO",
"acceso"=>"cd",
"identificador"=>"EDITED_OUT",
"txtBienvenida"=>"EDITED_OUT",
"usuarioValidado"=>"S",
"correo"=>"EDITED_OUT",
"tlf"=>"EDITED_OUT",
"tipoAcceso"=>"2",
"xusuario"=>"EDITED_OUT",
"nif"=>"EDITED_OUT",
"email"=>"EDITED_OUT",
"apellido1"=>"EDITED_OUT",
"apellido2"=>"EDITED_OUT",
"anagramaFiscal"=>"EDITED_OUT",
"nombre"=>"EDITED_OUT",
"tipoCertificado"=>"FNMT PF",
"emisor"=>"EDITED_OUT",
"usoCertificado"=>"EDITED_OUT",
"apellidosResponsable"=>"EDITED_OUT",
"politica"=>"1.3.6.1.4.1.5734.3.5",
"subject"=>"EDITED_OUT",
"versionPolitica"=>"45",
"organizacionEmisora"=>"FNMT",
"idPolitica"=>"DEFAULT",
"numSerie"=>"EDITED_OUT",
"clasificacion"=>"FNMT",
"tipoAfirma"=>"0"
},
@service="EDITED_OUT",
@failure_code=nil,
@ticket="EDITED_OUT",
@pgt_iou=nil,
@user=nil,
@failure_message=nil,
@success=true
>
Затем, исследуя XML-разбор и response.rb, я пришел к этому в строке 55:
cas_user = @xml.elements["cas:user"]
cas_user всегда равен nil, потому что в корневом каталоге XML нет элемента cas: user, но он есть как дочерний элемент для атрибутов cas:.
@xml.elements["cas:attributes/cas:user"]
возвращает что-то, в моем случае, что-то вроде дайджеста, хотя я не знаю, как это закодировано или какая информация есть.
У меня вопрос, является ли этот атрибут cas: attribute / cas: user тем, который клиент пытается проанализировать из XML, или это что-то еще. Кроме того, я хотел бы знать, является ли тот формат XML, который я вставил выше, совместимым с протоколом CAS-2.0 или ошибка происходит из-за плохо сформированного XML. Странно, что rubycas-client хранит все "полезные данные" внутри extra_attributes.
Я использую следующее:
- Рельсы 2.3.11
- jRuby 1.6.2 с использованием интерпретатора версии 1.8
- rubycas-client версия 2.3.10.rc1
Спасибо за вашу помощь.
1 ответ
cas:user - это имя сети / принципала, которое возвращается в ответе. Ваш вывод cas: заставляет меня думать, что сервер CAS использует OAUTH-провайдера. CAS также поддерживает анонимность атрибута имени пользователя для определенных служб, так что служба гарантированно получает имя пользователя в каждом экземпляре. Он может быть (де) выбран в реестре сервисов.
Протокол CAS 2.0 официально не поддерживает выпуск атрибутов; только протокол SAML 1.1 официально поддерживает это. (Предстоящий клиент CAS 3.0 будет официально поддерживать выпуск атрибутов.) Существует множество простых модификаций, которые внедряют многие сайты, чтобы позволить CAS 2.0 выпускать атрибуты, но сайты могут реализовывать их по своему усмотрению.