code: def token_request(self, authorization_code):
          
          if not self._client.token_endpoint:
              return None
  
          request = {
              'grant_type': 'authorization_code',
              'code': authorization_code,
              'redirect_uri': self._redirect_uri
          }
  
          logger.debug('making token request: %s', request)
          client_auth_method = self._client.registration_response.get('token_endpoint_auth_method', 'client_secret_basic')
          auth_header = _ClientAuthentication(self._client.client_id, self._client.client_secret)(client_auth_method,
                                                                                                  request)
          resp = self._provider_configuration.requests_session \
              .post(self._client.token_endpoint,
                    data=request,
                    headers=auth_header) \
              .json()
          logger.debug('received token response: %s', json.dumps(resp))
  
          if 'error' in resp:
              token_resp = TokenErrorResponse(**resp)
          else:
              token_resp = AccessTokenResponse(**resp)
              token_resp.verify(keyjar=self._client.keyjar)
              if 'id_token' in resp:
                  token_resp['id_token_jwt'] = resp['id_token']
  
          return token_resp
docs: Makes a token request.  If the 'token_endpoint' is not configured in the provider metadata, no request will
          be made.
  
          Args:
              authorization_code (str): authorization code issued to client after user authorization
  
          Returns:
              Union[AccessTokenResponse, TokenErrorResponse, None]: The parsed token response, or None if no token
              request was performed.