test_oauth2.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 TokenVerifier
  7. @pytest.fixture
  8. def patched_verifier(jwk_patched, settings):
  9. return TokenVerifier(settings)
  10. def test_verifier_ok(patched_verifier, token_generator):
  11. token = token_generator()
  12. verified_claims = patched_verifier("Bearer " + token)
  13. assert verified_claims.user.id == "foo"
  14. assert verified_claims.tenant is None
  15. assert verified_claims.scope == {"user"}
  16. patched_verifier.get_key.assert_called_once_with(token)
  17. def test_verifier_ok_with_username(patched_verifier, token_generator):
  18. token = token_generator(username="sinterklaas")
  19. verified_claims = patched_verifier("Bearer " + token)
  20. assert verified_claims.user.name == "sinterklaas"
  21. def test_verifier_ok_with_tenant(patched_verifier, token_generator):
  22. token = token_generator(tenant="15")
  23. verified_claims = patched_verifier("Bearer " + token)
  24. assert verified_claims.tenant.id == 15
  25. assert verified_claims.tenant.name == ""
  26. def test_verifier_ok_with_tenant_and_name(patched_verifier, token_generator):
  27. token = token_generator(tenant=15, tenant_name="foo")
  28. verified_claims = patched_verifier("Bearer " + token)
  29. assert verified_claims.tenant.id == 15
  30. assert verified_claims.tenant.name == "foo"
  31. def test_verifier_exp_leeway(patched_verifier, token_generator):
  32. token = token_generator(exp=int(time.time()) - 60)
  33. patched_verifier("Bearer " + token)
  34. def test_verifier_multiple_scopes(patched_verifier, token_generator, settings):
  35. token = token_generator(scope=f"scope1 {settings.scope} scope3")
  36. patched_verifier("Bearer " + token)
  37. @pytest.mark.parametrize(
  38. "claim_overrides",
  39. [
  40. {"iss": "https://authserver"},
  41. {"iss": None},
  42. {"scope": "nothing"},
  43. {"scope": None},
  44. {"exp": int(time.time()) - 3600},
  45. {"exp": None},
  46. {"nbf": int(time.time()) + 3600},
  47. {"token_use": "id"},
  48. {"token_use": None},
  49. {"sub": None},
  50. ],
  51. )
  52. def test_verifier_bad(patched_verifier, token_generator, claim_overrides):
  53. token = token_generator(**claim_overrides)
  54. with pytest.raises(Unauthorized):
  55. patched_verifier("Bearer " + token)
  56. def test_verifier_authorize(patched_verifier, token_generator):
  57. token = token_generator(sub="bar")
  58. with pytest.raises(PermissionDenied):
  59. patched_verifier("Bearer " + token)
  60. @pytest.mark.parametrize("prefix", ["", "foo ", "key ", "bearer ", "Bearer "])
  61. def test_verifier_bad_header_prefix(patched_verifier, token_generator, prefix):
  62. token = token_generator()
  63. with pytest.raises(Unauthorized):
  64. patched_verifier(prefix + token)
  65. @pytest.mark.parametrize("header", ["", None, " "])
  66. def test_verifier_no_header(patched_verifier, header):
  67. with pytest.raises(Unauthorized):
  68. patched_verifier(header)