Coverage for polar/oauth2/metadata.py: 96%
45 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from collections.abc import Callable
2from typing import TYPE_CHECKING
4from pydantic import BaseModel
6from polar.auth.scope import SCOPES_SUPPORTED
7from polar.config import settings
9from . import constants
11if TYPE_CHECKING: 11 ↛ 12line 11 didn't jump to line 12 because the condition on line 11 was never true
12 from .authorization_server import AuthorizationServer
15class OAuth2AuthorizationServerMetadata(BaseModel):
16 """
17 OAuth 2.0 Authorization Server Metadata
19 Conforms to RFC8414.
20 https://datatracker.ietf.org/doc/html/rfc8414
21 """
23 issuer: str
24 authorization_endpoint: str
25 token_endpoint: str
26 jwks_uri: str
27 registration_endpoint: str | None = None
28 scopes_supported: list[str]
29 response_types_supported: list[str]
30 response_modes_supported: list[str] | None = None
31 grant_types_supported: list[str] | None = None
32 token_endpoint_auth_methods_supported: list[str] | None = None
33 token_endpoint_auth_signing_alg_values_supported: list[str] | None = None
34 service_documentation: str | None = None
35 ui_locales_supported: list[str] | None = None
36 op_policy_uri: str | None = None
37 op_tos_uri: str | None = None
38 revocation_endpoint: str | None = None
39 revocation_endpoint_auth_methods_supported: list[str] | None = None
40 revocation_endpoint_auth_signing_alg_values_supported: list[str] | None = None
41 introspection_endpoint: str | None = None
42 introspection_endpoint_auth_methods_supported: list[str] | None = None
43 introspection_endpoint_auth_signing_alg_values_supported: list[str] | None = None
44 code_challenge_methods_supported: list[str] | None = None
47class OpenIDProviderMetadata(OAuth2AuthorizationServerMetadata):
48 """
49 OpenID Provider Metadata
51 Conforms to OpenID Connect Discovery 1.0 specification.
52 https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata
53 """
55 userinfo_endpoint: str
56 acr_values_supported: list[str] | None = None
57 subject_types_supported: list[str]
58 id_token_signing_alg_values_supported: list[str]
59 id_token_encryption_alg_values_supported: list[str] | None = None
60 id_token_encryption_enc_values_supported: list[str] | None = None
61 userinfo_signing_alg_values_supported: list[str] | None = None
62 userinfo_encryption_alg_values_supported: list[str] | None = None
63 userinfo_encryption_enc_values_supported: list[str] | None = None
64 request_object_signing_alg_values_supported: list[str] | None = None
65 request_object_encryption_alg_values_supported: list[str] | None = None
66 request_object_encryption_enc_values_supported: list[str] | None = None
67 display_values_supported: list[str] | None = None
68 claim_types_supported: list[str] | None = None
69 claims_supported: list[str] | None = None
70 claims_locales_supported: list[str] | None = None
71 claims_parameter_supported: bool | None = None
72 request_parameter_supported: bool | None = None
73 request_uri_parameter_supported: bool | None = None
74 require_request_uri_registration: bool | None = None
77def get_server_metadata(
78 authorization_server: "AuthorizationServer", url_for: Callable[[str], str]
79) -> OpenIDProviderMetadata:
80 return OpenIDProviderMetadata(
81 issuer=constants.ISSUER,
82 authorization_endpoint=f"{settings.FRONTEND_BASE_URL}/oauth2/authorize",
83 token_endpoint=url_for("oauth2:request_token"),
84 jwks_uri=url_for("well_known.jwks"),
85 userinfo_endpoint=url_for("oauth2:userinfo"),
86 registration_endpoint=url_for("oauth2:create_client"),
87 scopes_supported=SCOPES_SUPPORTED,
88 response_types_supported=authorization_server.response_types_supported,
89 response_modes_supported=authorization_server.response_modes_supported,
90 grant_types_supported=authorization_server.grant_types_supported,
91 token_endpoint_auth_methods_supported=authorization_server.token_endpoint_auth_methods_supported,
92 service_documentation=constants.SERVICE_DOCUMENTATION,
93 revocation_endpoint=url_for("oauth2:revoke_token"),
94 revocation_endpoint_auth_methods_supported=authorization_server.revocation_endpoint_auth_methods_supported,
95 introspection_endpoint=url_for("oauth2:introspect_token"),
96 introspection_endpoint_auth_methods_supported=authorization_server.introspection_endpoint_auth_methods_supported,
97 code_challenge_methods_supported=authorization_server.code_challenge_methods_supported,
98 subject_types_supported=constants.SUBJECT_TYPES_SUPPORTED,
99 id_token_signing_alg_values_supported=constants.ID_TOKEN_SIGNING_ALG_VALUES_SUPPORTED,
100 claims_supported=constants.CLAIMS_SUPPORTED,
101 )