我在SO的第一个问题,希望我能得到任何帮助。
问题的体系结构是:我有一个简单的Web应用程序,由Sinatra和Slim提供,并使用SSO CAS System进行身份验证。导入和细节:不使用Rails。
CAS过滤器是这样手工完成的:
class App < Sinatra::Application before do process_cas_login(request, session) require_authorization(request, session) unless logged_in?(request, session) end
CAS方法也是这样的:
def process_cas_login(请求,会话) 如果请求[:ticket]&amp;&amp;请求[:ticket]!= session [:ticket]
service_url = read_service_url(request) st = read_ticket(request[:ticket], service_url) CAS_CLIENT.validate_service_ticket(st) if st.success session[:cas_ticket] = st.ticket session[:cas_user] = st.user else redirect '/' #raise "Service Ticket validation failed! #{st.failure_code} - #{st.failure_message}" end end
端
def logged_in?(请求,会话) 会话[:cas_ticket]&amp;&amp; !会话[:cas_ticket] .empty?端
def require_authorization(请求,会话) if!logged_in?(请求,会话) service_url = read_service_url(request) url = CAS_CLIENT.add_service_to_login_url(service_url) 重定向网址 结束
问题是:我的后端需要从其他Sinatra应用程序调用REST服务并保留会话(询问票证,知道调用该服务的用户,类似的东西)
我正在阅读关于代理的内容,但我无法在我当前的模型中实现这一点,你有任何线索吗?
有一个使用Rails过滤器的演练,但同样,我没有使用Rails。
提前感谢您的帮助
答案 0 :(得分:0)
在您的应用中,您需要使用当前的ticket
,service
和{{{pgtUrl
来调用CAS服务器的代理验证网址(/ proxyValidate),而不是调用服务验证网址。 1}}参数。
在返回的XML中,您将获得一个包含PGTIOU的新cas:proxyGrantingTicket
标记:它必须存储在您应用的共享地图中:pgtIou
&lt; - &gt; user_identity
此pgtUrl
是您应用中的网址,它将从CAS服务器接收带有两个参数的回调:pgtIou
和pgtId
。使用以前的共享地图,您知道:pgtId
&lt; - &gt; user_identity。
对于用户身份,如果要调用REST服务,则需要通过调用CAS服务器的/ proxy url来获取它的票证,并提供pgt
参数(pgtId)和{ {1}} REST服务的参数。
最后,您只需通过提供服务票证就像任何CAS服务一样调用您的REST服务。此REST服务当然必须由CAS服务器保护,然后通过CAS服务器执行服务票证验证。