"OK: Success!", 304 => "Not Modified: There was no new data to return.", 400 => "Bad Request: The request was invalid.", 401 => "Unauthorized.", 403 => "Forbidden: The request is understood, but it has been refused.", 404 => "Not Found: The URI requested is invalid or the resource requested does not exists.", 406 => "Not Acceptable.", 500 => "Internal Server Error: Something is broken.", 502 => "Bad Gateway.", 503 => "Service Unavailable." ); if (!$code && $this->api) { $code = $this->api->http_code; } if (isset($http_status_codes[$code])) { return $code . " " . $http_status_codes[$code]; } } /** * Adapter initializer */ function initialize() { if (!$this->config["keys"]["id"] || !$this->config["keys"]["secret"]) { throw new Exception("Your application id and secret are required in order to connect to {$this->providerId}.", 4); } // override requested scope if (isset($this->config["scope"]) && !empty($this->config["scope"])) { $this->scope = $this->config["scope"]; } // include OAuth2 client require_once Hybrid_Auth::$config["path_libraries"] . "OAuth/OAuth2Client.php"; // create a new OAuth2 client instance $this->api = new OAuth2Client($this->config["keys"]["id"], $this->config["keys"]["secret"], $this->endpoint, $this->compressed); // If we have an access token, set it if ($this->token("access_token")) { $this->api->access_token = $this->token("access_token"); $this->api->refresh_token = $this->token("refresh_token"); $this->api->access_token_expires_in = $this->token("expires_in"); $this->api->access_token_expires_at = $this->token("expires_at"); } // Set curl proxy if exist if (isset(Hybrid_Auth::$config["proxy"])) { $this->api->curl_proxy = Hybrid_Auth::$config["proxy"]; } } /** * {@inheritdoc} */ function loginBegin() { // redirect the user to the provider authentication url Hybrid_Auth::redirect($this->api->authorizeUrl(array("scope" => $this->scope))); } /** * {@inheritdoc} */ function loginFinish() { $error = (array_key_exists('error', $_REQUEST)) ? $_REQUEST['error'] : ""; // check for errors if ($error) { throw new Exception("Authentication failed! {$this->providerId} returned an error: $error", 5); } // try to authenticate user $code = (array_key_exists('code', $_REQUEST)) ? $_REQUEST['code'] : ""; try { $this->api->authenticate($code); } catch (Exception $e) { throw new Exception("User profile request failed! {$this->providerId} returned an error: $e", 6); } // check if authenticated if (!$this->api->access_token) { throw new Exception("Authentication failed! {$this->providerId} returned an invalid access token.", 5); } // store tokens $this->token("access_token", $this->api->access_token); $this->token("refresh_token", $this->api->refresh_token); $this->token("expires_in", $this->api->access_token_expires_in); $this->token("expires_at", $this->api->access_token_expires_at); // set user connected locally $this->setUserConnected(); } /** * {@inheritdoc} */ function refreshToken() { // have an access token? if ($this->api->access_token) { // have to refresh? if ($this->api->refresh_token && $this->api->access_token_expires_at) { // expired? if ($this->api->access_token_expires_at <= time()) { $response = $this->api->refreshToken(array("refresh_token" => $this->api->refresh_token)); if (!isset($response->access_token) || !$response->access_token) { // set the user as disconnected at this point and throw an exception $this->setUserUnconnected(); throw new Exception("The Authorization Service has return an invalid response while requesting a new access token. " . (string) $response->error); } // set new access_token $this->api->access_token = $response->access_token; if (isset($response->refresh_token)) $this->api->refresh_token = $response->refresh_token; if (isset($response->expires_in)) { $this->api->access_token_expires_in = $response->expires_in; // even given by some idp, we should calculate this $this->api->access_token_expires_at = time() + $response->expires_in; } } } // re store tokens $this->token("access_token", $this->api->access_token); $this->token("refresh_token", $this->api->refresh_token); $this->token("expires_in", $this->api->access_token_expires_in); $this->token("expires_at", $this->api->access_token_expires_at); } } }