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

Access Token middleware #14

Merged
merged 15 commits into from
Oct 2, 2020
Merged

Access Token middleware #14

merged 15 commits into from
Oct 2, 2020

Conversation

caspervdw
Copy link
Contributor

@caspervdw caspervdw commented Sep 30, 2020

See the issue description in #11

This appeared to be a lot harder than I anticipated. authlib only has some low-level JWT methods to validate access tokens, so I had to write part of the validation myself (unlike with the ID Tokens in the authorize view)

On top of that, AWS Cognito does not adhere to the RFC for Access Tokens. I decided to stick to the RFC in the implementation, but add a preprocessor_access_token function that adapts the access token so that it conforms to the RFC.

There is some duplicate logic in the middleware and in the authorize view. I didn't want to touch that because the diff of this PR is already pretty large.

@caspervdw caspervdw requested a review from byrman September 30, 2020 13:30
@caspervdw caspervdw requested a review from reinout September 30, 2020 13:54
README.rst Outdated
-------------------------

General
~~~~~~~
Copy link
Member

Choose a reason for hiding this comment

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

In m'n proefschrift kon ik toe met 3 header levels. Da's toch niet nodig in een readme? Max twee.
Liever h2 "general usage", "view", enz.

Anders lijkt het op de 3di docs waar de adviseurs absoluut niet zonder vijf heading levels kunnen geloof ik...

README.rst Outdated

The nens-auth-client library exposes one django application: ``nens_auth_client``.
The django built-in apps ``auth``, ``sessions`` and ``contenttypes`` are
also required, but they probably are already there.
Add these to the ``INSTALLED_APPS`` setting:
Add these to the ``INSTALLED_APPS`` setting::
Copy link
Member

Choose a reason for hiding this comment

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

Kan er nog iets over de volgorde bij? Da's de standaard vraag die ik me altijd bij dit soort settings stel. Of er iets specifiek voor/na een ander moet.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Order is alleen belangrijk bij het overriden van een template / translation / mgmt command:

https://stackoverflow.com/questions/31925458/importance-of-apps-orders-in-installed-apps

README.rst Outdated Show resolved Hide resolved
README.rst Outdated Show resolved Hide resolved
README.rst Outdated Show resolved Hide resolved
Comment on lines +36 to +38
# Do something only if there is a Bearer token and there is no user.
if not (token and request.user.is_anonymous):
return self.get_response(request)
Copy link
Member

Choose a reason for hiding this comment

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

Dit klopt met de docstring. Bearer token wordt genegeerd als er al een reguliere gebruiker is.

Is het niet iets dat op een mogelijk probleem wijst? Als een ingelogde gebruiker OOK nog eens een bearer token heeft? Even loggen zou het uitzoeken van problemen kunnen verhelpen.

Suggested change
# Do something only if there is a Bearer token and there is no user.
if not (token and request.user.is_anonymous):
return self.get_response(request)
# Do something only if there is a Bearer token and there is no user.
if not token:
return self.get_response(request)
if not request.user.is_anonymous):
logger.warn("Aargh, bearer token maar toch ingelogd!!!")
return self.get_response(request)

Copy link
Contributor Author

@caspervdw caspervdw Oct 2, 2020

Choose a reason for hiding this comment

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

Dit zie ik wel als een user error, en niet een voor developers. Bij Lizard's setup krijg je nu een sentry melding om je oren.

In de RFC voor bearer tokens lees ik dat je een 400 zou moeten geven in dit geval (2 authenticatie methodes in 1):

invalid_request
The request is missing a required parameter, includes an
unsupported parameter or parameter value, repeats the same
parameter, uses more than one method for including an access
token, or is otherwise malformed. The resource server SHOULD
respond with the HTTP 400 (Bad Request) status code.

Misschien is dat het duidelijkst voor iedereen? Anders krijg je misschien situaties waarin het onduidelijk is waarom een Bearer token wordt genegeerd. "Oooh ik had nog een session cookie"

from django.conf import settings
from django.utils.module_loading import import_string

import requests


# Create the global OAuth registry
oauth = OAuth()
Copy link
Member

Choose a reason for hiding this comment

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

Caps? OAUTH_REGISTRY? In hoeverre is het privé in dit bestand?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Caps is geloof ik alleen voor echt constantes. Hij wordt hier en daar geimporteerd om de cognito client te krijgen en de OpenID Connect flow te doen (zie views.py).

Zal ik er oauth_registry van maken?

nens_auth_client/cognito.py Outdated Show resolved Hide resolved
nens_auth_client/cognito.py Show resolved Hide resolved
nens_auth_client/tests/test_cognito.py Show resolved Hide resolved
@caspervdw
Copy link
Contributor Author

@reinout ik heb al je punten bekeken. Een open issue is nog: wat te doen als er een session cookie en een bearer token is? Zie mijn commentaar boven.

@caspervdw
Copy link
Contributor Author

Ik laat het open punt even over aan #15

@caspervdw caspervdw merged commit 6ead643 into master Oct 2, 2020
@caspervdw caspervdw deleted the casper-middleware branch October 2, 2020 11:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants