code: func (h PfssoHandler) parseSsoRequest(ctx context.Context, body io.Reader) (map[string]string, int, error) {
  	var info map[string]string
  	err := json.NewDecoder(body).Decode(&info)
  
  	if err != nil {
  		msg := fmt.Sprintf("Error while decoding payload: %s", err)
  		log.LoggerWContext(ctx).Error(msg)
  		return nil, 0, errors.New(msg)
  	}
  
  	timeout, err := strconv.ParseInt(info["timeout"], 10, 32)
  	if err != nil {
  		log.LoggerWContext(ctx).Warn(fmt.Sprintf("Can't parse timeout '%s' into an int (%s). Will not specify timeout for request.", info["timeout"], err))
  	}
  
  	if err := h.validateInfo(ctx, info); err != nil {
  		return nil, 0, err
  	}
  
  	if info["stripped_username"] == "" {
  		log.LoggerWContext(ctx).Warn("No stripped_username set in the request, using the username as the stripped_username and no realm")
  		info["stripped_username"] = info["username"]
  	}
  
  	return info, int(timeout), nil
  }
docs: // Parse the body of a pfsso request to extract a map[string]string of all the attributes that were sent
  // Return an error if the JSON payload cannot be decoded properly
  // Will also validate that the necessary fields are there in the payload and return an error if some are missing