Class: CASClient::Client
- Inherits:
-
Object
- Object
- CASClient::Client
- Defined in:
- lib/casclient/client.rb
Overview
The client brokers all HTTP transactions with the CAS server.
Instance Attribute Summary (collapse)
-
- (Object) cas_base_url
readonly
Returns the value of attribute cas_base_url.
-
- (Object) cas_destination_logout_param_name
readonly
Returns the value of attribute cas_destination_logout_param_name.
-
- (Object) extra_attributes_session_key
readonly
Returns the value of attribute extra_attributes_session_key.
-
- (Object) log
readonly
Returns the value of attribute log.
- - (Object) login_url
-
- (Object) logout_url(destination_url = nil, follow_url = nil, service_url = nil)
Returns the CAS server's logout url.
-
- (Object) proxy_callback_url
Returns the value of attribute proxy_callback_url.
-
- (Object) proxy_host
readonly
Returns the value of attribute proxy_host.
-
- (Object) proxy_port
readonly
Returns the value of attribute proxy_port.
-
- (Object) proxy_retrieval_url
Returns the value of attribute proxy_retrieval_url.
- - (Object) proxy_url
-
- (Object) service_url
writeonly
Sets the attribute service_url.
-
- (Object) ticket_store
readonly
Returns the value of attribute ticket_store.
-
- (Object) username_session_key
readonly
Returns the value of attribute username_session_key.
- - (Object) validate_url
Instance Method Summary (collapse)
- - (Object) add_service_to_login_url(service_url)
-
- (Boolean) cas_server_is_up?
Returns true if the configured CAS server is up and responding; false otherwise.
- - (Object) configure(conf)
-
- (Client) initialize(conf = nil)
constructor
A new instance of Client.
-
- (Object) login_to_service(credentials, service)
Requests a login using the given credentials for the given service; returns a LoginResponse object.
-
- (Object) request_login_ticket
Requests a login ticket from the CAS server for use in a login request; returns a LoginTicket object.
-
- (Object) request_proxy_ticket(pgt, target_service)
Requests a proxy ticket from the CAS server for the given service using the given pgt (proxy granting ticket); returns a ProxyTicket object.
- - (Object) retrieve_proxy_granting_ticket(pgt_iou)
- - (Object) validate_service_ticket(st) (also: #validate_proxy_ticket)
Constructor Details
- (Client) initialize(conf = nil)
A new instance of Client
11 12 13 |
# File 'lib/casclient/client.rb', line 11 def initialize(conf = nil) configure(conf) if conf end |
Instance Attribute Details
- (Object) cas_base_url (readonly)
Returns the value of attribute cas_base_url
4 5 6 |
# File 'lib/casclient/client.rb', line 4 def cas_base_url @cas_base_url end |
- (Object) cas_destination_logout_param_name (readonly)
Returns the value of attribute cas_destination_logout_param_name
4 5 6 |
# File 'lib/casclient/client.rb', line 4 def cas_destination_logout_param_name @cas_destination_logout_param_name end |
- (Object) extra_attributes_session_key (readonly)
Returns the value of attribute extra_attributes_session_key
5 6 7 |
# File 'lib/casclient/client.rb', line 5 def extra_attributes_session_key @extra_attributes_session_key end |
- (Object) log (readonly)
Returns the value of attribute log
5 6 7 |
# File 'lib/casclient/client.rb', line 5 def log @log end |
- (Object) login_url
65 66 67 |
# File 'lib/casclient/client.rb', line 65 def login_url @login_url || (cas_base_url + "/login") end |
- (Object) logout_url(destination_url = nil, follow_url = nil, service_url = nil)
Returns the CAS server's logout url.
If a logout_url has not been explicitly configured, the default is cas_base_url + “/logout”.
destination_url |
Set this if you want the user to be able to immediately log back in. Generally you'll want to use something like request.referer. Note that the above behaviour describes RubyCAS-Server – other CAS server implementations might use this parameter differently (or not at all). |
follow_url |
This satisfies section 2.3.1 of the CAS protocol spec. See www.ja-sig.org/products/cas/overview/protocol |
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/casclient/client.rb', line 86 def logout_url(destination_url = nil, follow_url = nil, service_url = nil) url = @logout_url || (cas_base_url + "/logout") uri = URI.parse(url) service_url = (service_url if service_url) || @service_url h = uri.query ? query_to_hash(uri.query) : {} if destination_url # if present, remove the 'ticket' parameter from the destination_url duri = URI.parse(destination_url) dh = duri.query ? query_to_hash(duri.query) : {} dh.delete('ticket') duri.query = hash_to_query(dh) destination_url = duri.to_s.gsub(/\?$/, '') h[cas_destination_logout_param_name] = destination_url if destination_url h['gateway'] = 'true' elsif follow_url h['url'] = follow_url if follow_url h['service'] = service_url else h['service'] = service_url end uri.query = hash_to_query(h) uri.to_s end |
- (Object) proxy_callback_url
Returns the value of attribute proxy_callback_url
9 10 11 |
# File 'lib/casclient/client.rb', line 9 def proxy_callback_url @proxy_callback_url end |
- (Object) proxy_host (readonly)
Returns the value of attribute proxy_host
7 8 9 |
# File 'lib/casclient/client.rb', line 7 def proxy_host @proxy_host end |
- (Object) proxy_port (readonly)
Returns the value of attribute proxy_port
7 8 9 |
# File 'lib/casclient/client.rb', line 7 def proxy_port @proxy_port end |
- (Object) proxy_retrieval_url
Returns the value of attribute proxy_retrieval_url
9 10 11 |
# File 'lib/casclient/client.rb', line 9 def proxy_retrieval_url @proxy_retrieval_url end |
- (Object) proxy_url
111 112 113 |
# File 'lib/casclient/client.rb', line 111 def proxy_url @proxy_url || (cas_base_url + "/proxy") end |
- (Object) service_url=(value) (writeonly)
Sets the attribute service_url
8 9 10 |
# File 'lib/casclient/client.rb', line 8 def service_url=(value) @service_url = value end |
- (Object) ticket_store (readonly)
Returns the value of attribute ticket_store
6 7 8 |
# File 'lib/casclient/client.rb', line 6 def ticket_store @ticket_store end |
- (Object) username_session_key (readonly)
Returns the value of attribute username_session_key
5 6 7 |
# File 'lib/casclient/client.rb', line 5 def username_session_key @username_session_key end |
- (Object) validate_url
69 70 71 |
# File 'lib/casclient/client.rb', line 69 def validate_url @validate_url || (cas_base_url + "/proxyValidate") end |
Instance Method Details
- (Object) add_service_to_login_url(service_url)
225 226 227 228 229 |
# File 'lib/casclient/client.rb', line 225 def add_service_to_login_url(service_url) uri = URI.parse(login_url) uri.query = (uri.query ? uri.query + "&" : "") + "service=#{CGI.escape(service_url)}" uri.to_s end |
- (Boolean) cas_server_is_up?
Returns true if the configured CAS server is up and responding; false otherwise.
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/casclient/client.rb', line 138 def cas_server_is_up? uri = URI.parse(login_url) log.debug "Checking if CAS server at URI '#{uri}' is up..." https = https_connection(uri) begin raw_res = https.start do |conn| conn.get("#{uri.path}?#{uri.query}") end rescue Errno::ECONNREFUSED => e log.warn "CAS server did not respond! (#{e.inspect})" return false end log.debug "CAS server responded with #{raw_res.inspect}:\n#{raw_res.body}" return raw_res.kind_of?(Net::HTTPSuccess) end |
- (Object) configure(conf)
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/casclient/client.rb', line 15 def configure(conf) #TODO: raise error if conf contains unrecognized cas options (this would help detect user typos in the config) raise ArgumentError, "Missing :cas_base_url parameter!" unless conf[:cas_base_url] if conf.has_key?("encode_extra_attributes_as") unless (conf[:encode_extra_attributes_as] == :json || conf[:encode_extra_attributes_as] == :yaml) raise ArgumentError, "Unkown Value for :encode_extra_attributes_as parameter! Allowed options are json or yaml - #{conf[:encode_extra_attributes_as]}" end end @cas_base_url = conf[:cas_base_url].gsub(/\/$/, '') @cas_destination_logout_param_name = conf[:cas_destination_logout_param_name] @login_url = conf[:login_url] @logout_url = conf[:logout_url] @validate_url = conf[:validate_url] @proxy_url = conf[:proxy_url] @service_url = conf[:service_url] @force_ssl_verification = conf[:force_ssl_verification] @proxy_callback_url = conf[:proxy_callback_url] #proxy server settings @proxy_host = conf[:proxy_host] @proxy_port = conf[:proxy_port] @username_session_key = conf[:username_session_key] || :cas_user @extra_attributes_session_key = conf[:extra_attributes_session_key] || :cas_extra_attributes @ticket_store_class = case conf[:ticket_store] when :local_dir_ticket_store, nil CASClient::Tickets::Storage::LocalDirTicketStore when :active_record_ticket_store require 'casclient/tickets/storage/active_record_ticket_store' CASClient::Tickets::Storage::ActiveRecordTicketStore else conf[:ticket_store] end @ticket_store = @ticket_store_class.new conf[:ticket_store_config] raise CASException, "The Ticket Store is not a subclass of AbstractTicketStore, it is a #{@ticket_store_class}" unless @ticket_store.kind_of? CASClient::Tickets::Storage::AbstractTicketStore @log = CASClient::LoggerWrapper.new @log.set_real_logger(conf[:logger]) if conf[:logger] @ticket_store.log = @log @conf_options = conf end |
- (Object) login_to_service(credentials, service)
Requests a login using the given credentials for the given service; returns a LoginResponse object.
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/casclient/client.rb', line 161 def login_to_service(credentials, service) lt = request_login_ticket data = credentials.merge( :lt => lt, :service => service ) res = submit_data_to_cas(login_url, data) response = CASClient::LoginResponse.new(res) if response.is_success? log.info("Login was successful for ticket: #{response.ticket.inspect}.") end return response end |
- (Object) request_login_ticket
Requests a login ticket from the CAS server for use in a login request; returns a LoginTicket object.
This only works with RubyCAS-Server, since obtaining login tickets in this manner is not part of the official CAS spec.
184 185 186 187 188 189 190 191 192 |
# File 'lib/casclient/client.rb', line 184 def request_login_ticket uri = URI.parse(login_url+'Ticket') https = https_connection(uri) res = https.post(uri.path, ';') raise CASException, res.body unless res.kind_of? Net::HTTPSuccess res.body.strip end |
- (Object) request_proxy_ticket(pgt, target_service)
Requests a proxy ticket from the CAS server for the given service using the given pgt (proxy granting ticket); returns a ProxyTicket object.
The pgt required to request a proxy ticket is obtained as part of a ValidationResponse.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/casclient/client.rb', line 200 def request_proxy_ticket(pgt, target_service) uri = URI.parse(proxy_url) h = uri.query ? query_to_hash(uri.query) : {} h['pgt'] = pgt.ticket h['targetService'] = target_service uri.query = hash_to_query(h) response = request_cas_response(uri, ProxyResponse) pt = ProxyTicket.new(response.proxy_ticket, target_service) pt.success = response.is_success? pt.failure_code = response.failure_code pt. = response. return pt end |
- (Object) retrieve_proxy_granting_ticket(pgt_iou)
217 218 219 220 221 222 223 |
# File 'lib/casclient/client.rb', line 217 def retrieve_proxy_granting_ticket(pgt_iou) pgt = @ticket_store.retrieve_pgt(pgt_iou) raise CASException, "Couldn't find pgt for pgt_iou #{pgt_iou}" unless pgt ProxyGrantingTicket.new(pgt, pgt_iou) end |
- (Object) validate_service_ticket(st) Also known as: validate_proxy_ticket
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/casclient/client.rb', line 115 def validate_service_ticket(st) uri = URI.parse(validate_url) h = uri.query ? query_to_hash(uri.query) : {} h['service'] = st.service h['ticket'] = st.ticket h['renew'] = "1" if st.renew h['pgtUrl'] = proxy_callback_url if proxy_callback_url uri.query = hash_to_query(h) response = request_cas_response(uri, ValidationResponse) st.user = response.user st.extra_attributes = response.extra_attributes st.pgt_iou = response.pgt_iou st.success = response.is_success? st.failure_code = response.failure_code st. = response. return st end |