code: def verify_keys(app_req, required_keys, issuer=None):
      
      if not issuer:
          issuer = _get_issuer(app_req=app_req)
      key_vals = []
      for key_path in required_keys:
          parent = app_req
          for kp in key_path.split('.'):
              if not isinstance(parent, dict):
                  raise InvalidJWT('JWT is missing %r: %s is not a dict'
                                   % (key_path, kp), issuer=issuer)
              val = parent.get(kp, None)
              if not val:
                  raise InvalidJWT('JWT is missing %r: %s is not a valid key'
                                   % (key_path, kp), issuer=issuer)
              parent = val
          key_vals.append(parent)  # last value of key_path
      return key_vals
docs: Verify all JWT object keys listed in required_keys.
  
      Each required key is specified as a dot-separated path.
      The key values are returned as a list ordered by how
      you specified them.
  
      Take this JWT for example::
  
          {
              "iss": "...",
              "aud": "...",
              "request": {
                  "pricePoint": 1,
              }
          }
  
      You could verify the presence of all keys and retrieve
      their values like this::
  
          iss, aud, price = verify_keys(jwt_dict,
                                        ('iss',
                                         'aud',
                                         'request.pricePoint'))
  
      Do you see how the comma separated assigned variables
      match the keys that were extracted? The order is important.