Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the relay_state optional in the response. #15

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions flask_saml2/sp/sp.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class ServiceProvider:
def login_successful(
self,
auth_data: AuthData,
relay_state: str,
redirect_to: str,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As you've used request.form.get('RelayState') below, the type of this should now be Optional[str]

) -> Response:
""" Called when a user is successfully logged on.
Subclasses should override this if they want to do more
Expand All @@ -49,7 +49,9 @@ def login_successful(
but they *must* call ``super()``.
"""
self.set_auth_data_in_session(auth_data)
return redirect(relay_state)
if not redirect_to:
redirect_to = self.get_login_return_url()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be get_default_login_return_url(), as get_login_return_url() will check request.args.get('next'), potentially allowing the IdP to inject its own redirect parameter. (Ignoring that the IdP could alter RelayState to achieve the same thing).

Both get_login_return_url() and get_default_login_return_url() can return None in their default implementations. In this case, it would be appropriate to raise an error in login_successful(), as there is nothing else we can do. If the developer has not overridden get_default_login_return_url() then there is no where to redirect to.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your review!
As this is a web application, I am a bit reluctant to raise an error "by default". What about returning / as default login return URL, so it is not so easy to get a traceback?

return redirect(redirect_to)

# Service provider configuration

Expand Down Expand Up @@ -168,7 +170,7 @@ def get_login_return_url(self) -> Optional[str]:
for url in urls:
if url is None:
continue
url = self.make_absolute_url(url)

if self.is_valid_redirect_url(url):
return url

Expand Down
2 changes: 1 addition & 1 deletion flask_saml2/sp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def do_logout(self, handler):
class AssertionConsumer(SAML2View):
def post(self):
saml_request = request.form['SAMLResponse']
relay_state = request.form['RelayState']
relay_state = request.form.get('RelayState')

for handler in self.sp.get_idp_handlers():
try:
Expand Down