code: def handle_userinfo_request(self, request=None, http_headers=None):
          # type: (Optional[str], Optional[Mapping[str, str]]) -> oic.oic.message.OpenIDSchema
          
          if http_headers is None:
              http_headers = {}
          userinfo_request = dict(parse_qsl(request))
          bearer_token = extract_bearer_token_from_http_request(userinfo_request, http_headers.get('Authorization'))
  
          introspection = self.authz_state.introspect_access_token(bearer_token)
          if not introspection['active']:
              raise InvalidAccessToken('The access token has expired')
          scopes = introspection['scope'].split()
          user_id = self.authz_state.get_user_id_for_subject_identifier(introspection['sub'])
  
          requested_claims = scope2claims(scopes, extra_scope_dict=self.extra_scopes)
          authentication_request = self.authz_state.get_authorization_request_for_access_token(bearer_token)
          requested_claims.update(self._get_requested_claims_in(authentication_request, 'userinfo'))
          user_claims = self.userinfo.get_claims_for(user_id, requested_claims)
  
          user_claims.setdefault('sub', introspection['sub'])
          response = OpenIDSchema(**user_claims)
          logger.debug('userinfo=%s from requested_claims=%s userinfo=%s',
                       response, requested_claims, user_claims)
          return response
docs: Handles a userinfo request.
          :param request: urlencoded request (either query string or POST body)
          :param http_headers: http headers