Skip to content

Commit e3b11ee

Browse files
author
Alexander Schrijver
committed
Add support for the POST-Binding for AuthNRequest.
1 parent 615bb73 commit e3b11ee

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

src/onelogin/saml2/auth.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,35 @@ def get_last_authn_contexts(self):
378378
"""
379379
return self.__last_authn_contexts
380380

381-
def login(self, return_to=None, force_authn=False, is_passive=False, set_nameid_policy=True, name_id_value_req=None):
381+
def _create_authn_request(
382+
self, force_authn=False, is_passive=False, set_nameid_policy=True, name_id_value_req=None
383+
):
384+
authn_request = self.authn_request_class(self.__settings, force_authn, is_passive, set_nameid_policy, name_id_value_req)
385+
386+
self.__last_request = authn_request.get_xml()
387+
self.__last_request_id = authn_request.get_id()
388+
return authn_request
389+
390+
def login_post(self, return_to=None, **authn_kwargs):
391+
authn_request = self._create_authn_request(**authn_kwargs)
392+
saml_request = OneLogin_Saml2_Utils.b64encode(
393+
OneLogin_Saml2_Utils.add_sign(
394+
authn_request.get_request(deflate=False, base64_encode=False),
395+
self.__settings.get_sp_key(), self.__settings.get_sp_cert(),
396+
sign_algorithm=OneLogin_Saml2_Constants.RSA_SHA256,
397+
digest_algorithm=OneLogin_Saml2_Constants.SHA256,),
398+
399+
)
400+
parameters = {'SAMLRequest': saml_request}
401+
402+
if return_to is not None:
403+
parameters['RelayState'] = return_to
404+
else:
405+
parameters['RelayState'] = OneLogin_Saml2_Utils.get_self_url_no_query(self.__request_data)
406+
407+
return self.get_sso_url(), parameters
408+
409+
def login(self, return_to=None, **authn_kwargs):
382410
"""
383411
Initiates the SSO process.
384412
@@ -400,9 +428,7 @@ def login(self, return_to=None, force_authn=False, is_passive=False, set_nameid_
400428
:returns: Redirection URL
401429
:rtype: string
402430
"""
403-
authn_request = self.authn_request_class(self.__settings, force_authn, is_passive, set_nameid_policy, name_id_value_req)
404-
self.__last_request = authn_request.get_xml()
405-
self.__last_request_id = authn_request.get_id()
431+
authn_request = self._create_authn_request(**authn_kwargs)
406432

407433
saml_request = authn_request.get_request()
408434
parameters = {'SAMLRequest': saml_request}

src/onelogin/saml2/authn_request.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def _generate_request_id(self):
134134
"""
135135
return OneLogin_Saml2_Utils.generate_unique_id()
136136

137-
def get_request(self, deflate=True):
137+
def get_request(self, deflate=True, base64_encode=True):
138138
"""
139139
Returns unsigned AuthnRequest.
140140
:param deflate: It makes the deflate process optional
@@ -143,9 +143,12 @@ def get_request(self, deflate=True):
143143
:rtype: str object
144144
"""
145145
if deflate:
146+
assert base64_encode is True, "Deflate without base64 encoding is not supported"
146147
request = OneLogin_Saml2_Utils.deflate_and_base64_encode(self.__authn_request)
147-
else:
148+
elif base64_encode:
148149
request = OneLogin_Saml2_Utils.b64encode(self.__authn_request)
150+
else:
151+
request = self.__authn_request
149152
return request
150153

151154
def get_id(self):

0 commit comments

Comments
 (0)