class_docstr: Signs and verifies JWT Token. Used to authorise and verify requests.
  
  :param secret_key: key used to sign the request
  :param expiration_time_in_seconds: time after which the token becomes invalid (in seconds)
  :param audience: audience that the request is expected to have
  :param leeway_in_seconds: leeway that allows for a small clock skew between the two parties
  :param algorithm: algorithm used for signing
docstr: Generate JWT with extra payload added.
  
  :param extra_payload: extra payload that is added to the signed token
  :return: signed token
docstr_tok: ["Generate","JWT","with","extra","payload","added",".",":","param","extra_payload",":","extra","payload","that","is","added","to","the","signed","token",":","return",":","signed","token"]
code: def generate_signed_token(self, extra_payload: dict[str, Any]) -> str:
      """
      Generate JWT with extra payload added.
  
      :param extra_payload: extra payload that is added to the signed token
      :return: signed token
      """
      jwt_dict = {
          "aud": self._audience,
          "iat": datetime.utcnow(),
          "nbf": datetime.utcnow(),
          "exp": datetime.utcnow()
          + timedelta(seconds=self._expiration_time_in_seconds),
      }
      jwt_dict.update(extra_payload)
      token = jwt.encode(
          jwt_dict,
          self._secret_key,
          algorithm=self._algorithm,
      )
      return token
  
imports: from __future__ import annotations
  from datetime import datetime, timedelta
  from typing import Any
  import jwt
label_desc: Use image node_id 2 for calling the JWTSigner obj's underlying member method code with example usage: obj.generate_signed_token(extra_payload) and returns: token