
    k7i                     l    S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
  SSKJr   " S	 S
5      rg)    )Optional)default_json_headers)jwt)AuthorizationServer)OAuth2Request)ResourceProtector   )UserInfoc                       \ rS rSrSrSr  SS\\   S\\   4S jjr	S\
4S	 jrS\
4S
 jrS\S\4S jrS\4S jrS rSrg)UserInfoEndpoint   a  OpenID Connect Core UserInfo Endpoint.

This endpoint returns information about a given user, as a JSON payload or as a JWT.
It must be subclassed and a few methods needs to be manually implemented::

    class UserInfoEndpoint(oidc.core.UserInfoEndpoint):
        def get_issuer(self):
            return "https://auth.example"

        def generate_user_info(self, user, scope):
            return UserInfo(
                sub=user.id,
                name=user.name,
                ...
            ).filter(scope)

        def resolve_private_key(self):
            return server_private_jwk_set()

It is also needed to pass a :class:`~authlib.oauth2.rfc6749.ResourceProtector` instance
with a registered :class:`~authlib.oauth2.rfc6749.TokenValidator` at initialization,
so the access to the endpoint can be restricter to valid token bearers::

    resource_protector = ResourceProtector()
    resource_protector.register_token_validator(BearerTokenValidator())
    server.register_endpoint(
        UserInfoEndpoint(resource_protector=resource_protector)
    )

And then you can plug the endpoint to your application::

    @app.route("/oauth/userinfo", methods=["GET", "POST"])
    def userinfo():
        return server.create_endpoint_response("userinfo")

userinfoNserverresource_protectorc                     Xl         X l        g N)r   r   )selfr   r   s      T/home/james-whalen/.local/lib/python3.13/site-packages/authlib/oidc/core/userinfo.py__init__UserInfoEndpoint.__init__4   s    
 "4    requestc                 8    U R                   R                  U5      $ r   )r   create_oauth2_request)r   r   s     r   create_endpoint_request(UserInfoEndpoint.create_endpoint_request<   s    {{0099r   c                    U R                   R                  S5      nUR                  5       nUR                  5       nU R	                  XBR
                  5      nUR                  R                  S5      =n(       aO  U R                  5       US'   UR                  US'   [        R                  " SU0XPR                  5       5      nSUS/4$ SU[        4$ )Nopeniduserinfo_signed_response_algissaudalg   )zContent-Typezapplication/jwt)r   acquire_token
get_clientget_usergenerate_user_infoscopeclient_metadataget
get_issuer	client_idr   encoderesolve_private_keyr   )r   r   tokenclientuser	user_infor"   datas           r   __call__UserInfoEndpoint.__call__?   s    ''55h?!!#~~++D++>	((,,-KLL3L
  $0Ie%//Ie::uclI7O7O7QRDBCCCI333r   r(   returnc                     [        5       e)af  
Generate a :class:`~authlib.oidc.core.UserInfo` object for an user::

    def generate_user_info(self, user, scope: str) -> UserInfo:
        return UserInfo(
            given_name=user.given_name,
            family_name=user.last_name,
            email=user.email,
            ...
        ).filter(scope)

This method must be implemented by developers.
NotImplementedError)r   r1   r(   s      r   r'   #UserInfoEndpoint.generate_user_infoR   s     "##r   c                     [        5       e)a  The OP's Issuer Identifier URL.

The value is used to fill the ``iss`` claim that is mandatory in signed userinfo::

    def get_issuer(self) -> str:
        return "https://auth.example"

This method must be implemented by developers to support JWT userinfo.
r8   r   s    r   r+   UserInfoEndpoint.get_issuerb   s     "##r   c                     g)zReturn the server JSON Web Key Set.

This is used to sign userinfo payloads::

    def resolve_private_key(self):
        return server_private_jwk_set()

This method must be implemented by developers to support JWT userinfo signing.
N r<   s    r   r.   $UserInfoEndpoint.resolve_private_keyn   s     r   )r   r   )NN)__name__
__module____qualname____firstlineno____doc__ENDPOINT_NAMEr   r   r   r   r   r   r4   strr
   r'   r+   r.   __static_attributes__r?   r   r   r   r      sv    #J M 15:>5,-5 %%675:} :4 4&$c $h $ 
$C 
$
r   r   N)typingr   authlib.constsr   authlib.joser   +authlib.oauth2.rfc6749.authorization_serverr   r   )authlib.oauth2.rfc6749.resource_protectorr   claimsr
   r   r?   r   r   <module>rO      s&     /  K E G l lr   