Class: OneLogin::RubySaml::Authrequest
- Inherits:
-
Object
- Object
- OneLogin::RubySaml::Authrequest
- Defined in:
- lib/onelogin/ruby-saml/authrequest.rb
Instance Attribute Summary collapse
-
#uuid ⇒ Object
readonly
AuthNRequest ID.
Instance Method Summary collapse
- #create(settings, params = {}) ⇒ Object
- #create_authentication_xml_doc(settings) ⇒ Object
-
#create_params(settings, params = {}) ⇒ Hash
Creates the Get parameters for the request.
- #create_xml_document(settings) ⇒ Object
-
#initialize ⇒ Authrequest
constructor
Initializes the AuthNRequest.
- #sign_document(document, settings) ⇒ Object
Constructor Details
#initialize ⇒ Authrequest
Initializes the AuthNRequest. An Authrequest Object. Asigns an ID, a random uuid.
17 18 19 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 17 def initialize @uuid = OneLogin::RubySaml::Utils.uuid end |
Instance Attribute Details
#uuid ⇒ Object (readonly)
AuthNRequest ID
12 13 14 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 12 def uuid @uuid end |
Instance Method Details
#create(settings, params = {}) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 21 def create(settings, params = {}) params = create_params(settings, params) params_prefix = (settings.idp_sso_target_url =~ /\?/) ? '&' : '?' saml_request = CGI.escape(params.delete("SAMLRequest")) request_params = "#{params_prefix}SAMLRequest=#{saml_request}" params.each_pair do |key, value| request_params << "&#{key.to_s}=#{CGI.escape(value.to_s)}" end raise SettingError.new "Invalid settings, idp_sso_target_url is not set!" if settings.idp_sso_target_url.nil? or settings.idp_sso_target_url.empty? @login_url = settings.idp_sso_target_url + request_params end |
#create_authentication_xml_doc(settings) ⇒ Object
90 91 92 93 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 90 def create_authentication_xml_doc(settings) document = create_xml_document(settings) sign_document(document, settings) end |
#create_params(settings, params = {}) ⇒ Hash
Creates the Get parameters for the request.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 38 def create_params(settings, params={}) # The method expects :RelayState but sometimes we get 'RelayState' instead. # Based on the HashWithIndifferentAccess value in Rails we could experience # conflicts so this line will solve them. relay_state = params[:RelayState] || params['RelayState'] if relay_state.nil? params.delete(:RelayState) params.delete('RelayState') end request_doc = create_authentication_xml_doc(settings) request_doc.context[:attribute_quote] = :quote if settings.double_quote_xml_attribute_values request = "" request_doc.write(request) Logging.debug "Created AuthnRequest: #{request}" request = Zlib::Deflate.deflate(request, 9)[2..-5] if settings.compress_request if Base64.respond_to?('strict_encode64') base64_request = Base64.strict_encode64(request) else base64_request = Base64.encode64(request).gsub(/\n/, "") end request_params = {"SAMLRequest" => base64_request} if settings.security[:authn_requests_signed] && !settings.security[:embed_sign] && settings.private_key params['SigAlg'] = settings.security[:signature_method] url_string = OneLogin::RubySaml::Utils.build_query( :type => 'SAMLRequest', :data => base64_request, :relay_state => relay_state, :sig_alg => params['SigAlg'] ) sign_algorithm = XMLSecurity::BaseDocument.new.algorithm(settings.security[:signature_method]) signature = settings.get_sp_key.sign(sign_algorithm.new, url_string) if Base64.respond_to?('strict_encode64') params['Signature'] = Base64.strict_encode64(signature) else params['Signature'] = Base64.encode64(signature).gsub(/\n/, "") end end params.each_pair do |key, value| request_params[key] = value.to_s end request_params end |
#create_xml_document(settings) ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 95 def create_xml_document(settings) time = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ') request_doc = XMLSecurity::Document.new request_doc.uuid = uuid root = request_doc.add_element "samlp:AuthnRequest", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol", "xmlns:saml" => "urn:oasis:names:tc:SAML:2.0:assertion" } root.attributes['ID'] = uuid root.attributes['IssueInstant'] = time root.attributes['Version'] = "2.0" root.attributes['Destination'] = settings.idp_sso_target_url unless settings.idp_sso_target_url.nil? or settings.idp_sso_target_url.empty? root.attributes['IsPassive'] = settings.passive unless settings.passive.nil? root.attributes['ProtocolBinding'] = settings.protocol_binding unless settings.protocol_binding.nil? root.attributes['ForceAuthn'] = settings.force_authn unless settings.force_authn.nil? # Conditionally defined elements based on settings if settings.assertion_consumer_service_url != nil root.attributes["AssertionConsumerServiceURL"] = settings.assertion_consumer_service_url end if settings.sp_entity_id != nil issuer = root.add_element "saml:Issuer" issuer.text = settings.sp_entity_id end if settings.name_identifier_value_requested != nil subject = root.add_element "saml:Subject" nameid = subject.add_element "saml:NameID" nameid.attributes['Format'] = settings.name_identifier_format if settings.name_identifier_format nameid.text = settings.name_identifier_value_requested subject_confirmation = subject.add_element "saml:SubjectConfirmation" subject_confirmation.attributes['Method'] = "urn:oasis:names:tc:SAML:2.0:cm:bearer" end if settings.name_identifier_format != nil root.add_element "samlp:NameIDPolicy", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol", # Might want to make AllowCreate a setting? "AllowCreate" => "true", "Format" => settings.name_identifier_format } end # BUG fix here -- if an authn_context is defined, add the tags with an "exact" # match required for authentication to succeed. If this is not defined, # the IdP will choose default rules for authentication. (Shibboleth IdP) if settings.authn_context != nil requested_context = root.add_element "samlp:RequestedAuthnContext", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol", "Comparison" => "exact", } class_ref = requested_context.add_element "saml:AuthnContextClassRef", { "xmlns:saml" => "urn:oasis:names:tc:SAML:2.0:assertion", } class_ref.text = settings.authn_context end request_doc end |
#sign_document(document, settings) ⇒ Object
155 156 157 158 159 160 161 162 163 164 |
# File 'lib/onelogin/ruby-saml/authrequest.rb', line 155 def sign_document(document, settings) # embed signature if settings.security[:authn_requests_signed] && settings.private_key && settings.certificate && settings.security[:embed_sign] private_key = settings.get_sp_key cert = settings.get_sp_cert document.sign_document(private_key, cert, settings.security[:signature_method], settings.security[:digest_method]) end document end |