Skip to content

Commit 35c0e03

Browse files
author
Alexander Schrijver
committed
Add support for the POST-Binding for AuthNRequest.
1 parent 88e264d commit 35c0e03

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
@@ -135,7 +135,7 @@ def _generate_request_id(self):
135135
"""
136136
return OneLogin_Saml2_Utils.generate_unique_id()
137137

138-
def get_request(self, deflate=True):
138+
def get_request(self, deflate=True, base64_encode=True):
139139
"""
140140
Returns unsigned AuthnRequest.
141141
:param deflate: It makes the deflate process optional
@@ -144,9 +144,12 @@ def get_request(self, deflate=True):
144144
:rtype: str object
145145
"""
146146
if deflate:
147+
assert base64_encode is True, "Deflate without base64 encoding is not supported"
147148
request = OneLogin_Saml2_Utils.deflate_and_base64_encode(self.__authn_request)
148-
else:
149+
elif base64_encode:
149150
request = OneLogin_Saml2_Utils.b64encode(self.__authn_request)
151+
else:
152+
request = self.__authn_request
150153
return request
151154

152155
def get_id(self):

0 commit comments

Comments
 (0)