使用CASClient和Sinatra代理CAS服务

时间:2015-08-06 18:44:43

标签: ruby sinatra cas

我在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。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

在您的应用中,您需要使用当前的ticketservice和{{{pgtUrl来调用CAS服务器的代理验证网址(/ proxyValidate),而不是调用服务验证网址。 1}}参数。 在返回的XML中,您将获得一个包含PGTIOU的新cas:proxyGrantingTicket标记:它必须存储在您应用的共享地图中:pgtIou&lt; - &gt; user_identity

pgtUrl是您应用中的网址,它将从CAS服务器接收带有两个参数的回调:pgtIoupgtId。使用以前的共享地图,您知道:pgtId&lt; - &gt; user_identity。

对于用户身份,如果要调用REST服务,则需要通过调用CAS服务器的/ proxy url来获取它的票证,并提供pgt参数(pgtId)和{ {1}} REST服务的参数。

最后,您只需通过提供服务票证就像任何CAS服务一样调用您的REST服务。此REST服务当然必须由CAS服务器保护,然后通过CAS服务器执行服务票证验证。