docs: def claims_match(value, claimspec):
      """
      Implements matching according to section 5.5.1 of
      http://openid.net/specs/openid-connect-core-1_0.html
      The lack of value is not checked here.
      Also the text doesn't prohibit having both 'value' and 'values'.
  
      :param value: single value
      :param claimspec: None or dictionary with 'essential', 'value' or 'values'
          as key
      :return: Boolean
      """
      if claimspec is None:  # match anything
          return True
  
      matched = False
      for key, val in claimspec.items():
          if key == "value":
              if value == val:
                  matched = True
          elif key == "values":
              if value in val:
                  matched = True
          elif key == 'essential':
              # Whether it's essential or not doesn't change anything here
              continue
  
          if matched:
              break
  
      if matched is False:
          if list(claimspec.keys()) == ['essential']:
              return True
  
      return matched