test_metadata.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. # -*- coding: utf-8 -*-
  2. import json
  3. from oauthlib.oauth2 import MetadataEndpoint, Server, TokenEndpoint
  4. from tests.unittest import TestCase
  5. class MetadataEndpointTest(TestCase):
  6. def setUp(self):
  7. self.metadata = {
  8. "issuer": 'https://foo.bar'
  9. }
  10. def test_openid_oauth2_preconfigured(self):
  11. default_claims = {
  12. "issuer": 'https://foo.bar',
  13. "authorization_endpoint": "https://foo.bar/authorize",
  14. "revocation_endpoint": "https://foo.bar/revoke",
  15. "introspection_endpoint": "https://foo.bar/introspect",
  16. "token_endpoint": "https://foo.bar/token"
  17. }
  18. from oauthlib.oauth2 import Server as OAuth2Server
  19. from oauthlib.openid import Server as OpenIDServer
  20. endpoint = OAuth2Server(None)
  21. metadata = MetadataEndpoint([endpoint], default_claims)
  22. oauth2_claims = metadata.claims
  23. endpoint = OpenIDServer(None)
  24. metadata = MetadataEndpoint([endpoint], default_claims)
  25. openid_claims = metadata.claims
  26. # Pure OAuth2 Authorization Metadata are similar with OpenID but
  27. # response_type not! (OIDC contains "id_token" and hybrid flows)
  28. del oauth2_claims['response_types_supported']
  29. del openid_claims['response_types_supported']
  30. self.maxDiff = None
  31. self.assertEqual(openid_claims, oauth2_claims)
  32. def test_create_metadata_response(self):
  33. endpoint = TokenEndpoint(None, None, grant_types={"password": None})
  34. metadata = MetadataEndpoint([endpoint], {
  35. "issuer": 'https://foo.bar',
  36. "token_endpoint": "https://foo.bar/token"
  37. })
  38. headers, body, status = metadata.create_metadata_response('/', 'GET')
  39. assert headers == {
  40. 'Content-Type': 'application/json',
  41. 'Access-Control-Allow-Origin': '*',
  42. }
  43. claims = json.loads(body)
  44. assert claims['issuer'] == 'https://foo.bar'
  45. def test_token_endpoint(self):
  46. endpoint = TokenEndpoint(None, None, grant_types={"password": None})
  47. metadata = MetadataEndpoint([endpoint], {
  48. "issuer": 'https://foo.bar',
  49. "token_endpoint": "https://foo.bar/token"
  50. })
  51. self.assertIn("grant_types_supported", metadata.claims)
  52. self.assertEqual(metadata.claims["grant_types_supported"], ["password"])
  53. def test_token_endpoint_overridden(self):
  54. endpoint = TokenEndpoint(None, None, grant_types={"password": None})
  55. metadata = MetadataEndpoint([endpoint], {
  56. "issuer": 'https://foo.bar',
  57. "token_endpoint": "https://foo.bar/token",
  58. "grant_types_supported": ["pass_word_special_provider"]
  59. })
  60. self.assertIn("grant_types_supported", metadata.claims)
  61. self.assertEqual(metadata.claims["grant_types_supported"], ["pass_word_special_provider"])
  62. def test_mandatory_fields(self):
  63. metadata = MetadataEndpoint([], self.metadata)
  64. self.assertIn("issuer", metadata.claims)
  65. self.assertEqual(metadata.claims["issuer"], 'https://foo.bar')
  66. def test_server_metadata(self):
  67. endpoint = Server(None)
  68. metadata = MetadataEndpoint([endpoint], {
  69. "issuer": 'https://foo.bar',
  70. "authorization_endpoint": "https://foo.bar/authorize",
  71. "introspection_endpoint": "https://foo.bar/introspect",
  72. "revocation_endpoint": "https://foo.bar/revoke",
  73. "token_endpoint": "https://foo.bar/token",
  74. "jwks_uri": "https://foo.bar/certs",
  75. "scopes_supported": ["email", "profile"]
  76. })
  77. expected_claims = {
  78. "issuer": "https://foo.bar",
  79. "authorization_endpoint": "https://foo.bar/authorize",
  80. "introspection_endpoint": "https://foo.bar/introspect",
  81. "revocation_endpoint": "https://foo.bar/revoke",
  82. "token_endpoint": "https://foo.bar/token",
  83. "jwks_uri": "https://foo.bar/certs",
  84. "scopes_supported": ["email", "profile"],
  85. "grant_types_supported": [
  86. "authorization_code",
  87. "password",
  88. "client_credentials",
  89. "refresh_token",
  90. "implicit"
  91. ],
  92. "token_endpoint_auth_methods_supported": [
  93. "client_secret_post",
  94. "client_secret_basic"
  95. ],
  96. "response_types_supported": [
  97. "code",
  98. "token"
  99. ],
  100. "response_modes_supported": [
  101. "query",
  102. "fragment"
  103. ],
  104. "code_challenge_methods_supported": [
  105. "plain",
  106. "S256"
  107. ],
  108. "revocation_endpoint_auth_methods_supported": [
  109. "client_secret_post",
  110. "client_secret_basic"
  111. ],
  112. "introspection_endpoint_auth_methods_supported": [
  113. "client_secret_post",
  114. "client_secret_basic"
  115. ]
  116. }
  117. def sort_list(claims):
  118. for k in claims.keys():
  119. claims[k] = sorted(claims[k])
  120. sort_list(metadata.claims)
  121. sort_list(expected_claims)
  122. self.assertEqual(sorted(metadata.claims.items()), sorted(expected_claims.items()))
  123. def test_metadata_validate_issuer(self):
  124. with self.assertRaises(ValueError):
  125. endpoint = TokenEndpoint(
  126. None, None, grant_types={"password": None},
  127. )
  128. metadata = MetadataEndpoint([endpoint], {
  129. "issuer": 'http://foo.bar',
  130. "token_endpoint": "https://foo.bar/token",
  131. })