test_verifier.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # (c) Nelen & Schuurmans
  2. import time
  3. import pytest
  4. from clean_python import PermissionDenied
  5. from clean_python import Unauthorized
  6. from clean_python.oauth2 import Token
  7. from clean_python.oauth2 import TokenVerifier
  8. @pytest.fixture
  9. def patched_verifier(jwk_patched, settings):
  10. return TokenVerifier(settings)
  11. def test_verifier_ok(patched_verifier, token_generator):
  12. token = token_generator()
  13. verified_token = patched_verifier("Bearer " + token)
  14. assert isinstance(verified_token, Token)
  15. assert verified_token.user.id == "foo"
  16. assert verified_token.tenant is None
  17. assert verified_token.scope == {"user"}
  18. patched_verifier.get_key.assert_called_once_with(token)
  19. def test_verifier_exp_leeway(patched_verifier, token_generator):
  20. token = token_generator(exp=int(time.time()) - 60)
  21. patched_verifier("Bearer " + token)
  22. def test_verifier_multiple_scopes(patched_verifier, token_generator, settings):
  23. token = token_generator(scope=f"scope1 {settings.scope} scope3")
  24. patched_verifier("Bearer " + token)
  25. @pytest.mark.parametrize(
  26. "claim_overrides",
  27. [
  28. {"iss": "https://authserver"},
  29. {"iss": None},
  30. {"scope": "nothing"},
  31. {"scope": None},
  32. {"exp": int(time.time()) - 3600},
  33. {"exp": None},
  34. {"nbf": int(time.time()) + 3600},
  35. {"token_use": "id"},
  36. {"token_use": None},
  37. {"sub": None},
  38. {"username": None},
  39. ],
  40. )
  41. def test_verifier_bad(patched_verifier, token_generator, claim_overrides):
  42. token = token_generator(**claim_overrides)
  43. with pytest.raises(Unauthorized):
  44. patched_verifier("Bearer " + token)
  45. def test_verifier_authorize(patched_verifier, token_generator):
  46. token = token_generator(sub="bar")
  47. with pytest.raises(PermissionDenied):
  48. patched_verifier("Bearer " + token)
  49. @pytest.mark.parametrize("prefix", ["", "foo ", "key ", "bearer ", "Bearer "])
  50. def test_verifier_bad_header_prefix(patched_verifier, token_generator, prefix):
  51. token = token_generator()
  52. with pytest.raises(Unauthorized):
  53. patched_verifier(prefix + token)
  54. @pytest.mark.parametrize("header", ["", None, " "])
  55. def test_verifier_no_header(patched_verifier, header):
  56. with pytest.raises(Unauthorized):
  57. patched_verifier(header)