Question

I'm using Hybridauth social login, and upon a user authenticating with Facebook, I receive the following error:

Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in /hybridauth/Hybrid/thirdparty/Facebook/base_facebook.php on line 1328

My guess (probably wrong) to why this may be happening is because the parameters used to pass to Hybridauth come from the browser URL, and I have two - page=register & connected_with=facebook. Hybridauth only requires the second one...

It actually authenticates, but I want rid of this error. Why does this warning occur? Is there a way to hide it?

This is the bit that errors:

 /**
   * Get the base domain used for the cookie.
   */
  protected function getBaseDomain() {
    // The base domain is stored in the metadata cookie  
    // if not we fallback to the current hostname
    $metadata = $this->getMetadataCookie();
    if (array_key_exists('base_domain', $metadata) &&
        !empty($metadata['base_domain'])) {
      return trim($metadata['base_domain'], '.');
    }
    return $this->getHttpHost();
  }

It's this code the warning comes from:

  /**
   * Destroy the current session
   */
  public function destroySession() {
    $this->accessToken = null;
    $this->signedRequest = null;
    $this->user = null;
    $this->clearAllPersistentData();

    // JavaScript sets a cookie that will be used in getSignedRequest 
    // that we need to clear if we can
    $cookie_name = $this->getSignedRequestCookieName();
    if (array_key_exists($cookie_name, $_COOKIE)) {
      unset($_COOKIE[$cookie_name]);
      if (!headers_sent()) {
        $base_domain = $this->getBaseDomain();
        setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
      } else {
        // @codeCoverageIgnoreStart
        self::errorLog(
          'There exists a cookie that we wanted to clear that we couldn\'t '.
          'clear because headers was already sent. Make sure to do the first '.
          'API call before outputting anything.'
        );
        // @codeCoverageIgnoreEnd
      }
    }
  }
Was it helpful?

Solution

It looks like getMetadataCookie() does not always return an array, possibly because the cookie has not yet been set. You may want to check that it's actually an array before using it as such;

if (is_array($metadata) && array_key_exists('base_domain', $metadata) &&

For the added code, the same would apply to array_key_exists() in the new code. If you're unsure if it's actually set to an array if the cookie is not set, check first.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top