user->getByGoogleId($google_id); if ($user) { $this->user->updateSession($user); $this->container['dispatcher']->dispatch('auth.success', new AuthEvent(self::AUTH_NAME, $user['id'])); return true; } return false; } /** * Unlink a Google account for a given user * * @access public * @param integer $user_id User id * @return boolean */ public function unlink($user_id) { return $this->user->update(array( 'id' => $user_id, 'google_id' => '', )); } /** * Update the user table based on the Google profile information * * @access public * @param integer $user_id User id * @param array $profile Google profile * @return boolean */ public function updateUser($user_id, array $profile) { return $this->user->update(array( 'id' => $user_id, 'google_id' => $profile['id'], 'email' => $profile['email'], 'name' => $profile['name'], )); } /** * Get the Google service instance * * @access public * @return \OAuth\OAuth2\Service\Google */ public function getService() { $uriFactory = new UriFactory(); $currentUri = $uriFactory->createFromSuperGlobalArray($_SERVER); $currentUri->setQuery('controller=user&action=google'); $storage = new Session(false); $credentials = new Credentials( GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, $currentUri->getAbsoluteUri() ); $serviceFactory = new ServiceFactory(); return $serviceFactory->createService( 'google', $credentials, $storage, array('userinfo_email', 'userinfo_profile') ); } /** * Get the authorization URL * * @access public * @return \OAuth\Common\Http\Uri\Uri */ public function getAuthorizationUrl() { return $this->getService()->getAuthorizationUri(); } /** * Get Google profile information from the API * * @access public * @param string $code Google authorization code * @return bool|array */ public function getGoogleProfile($code) { try { $googleService = $this->getService(); $googleService->requestAccessToken($code); return json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true); } catch (TokenResponseException $e) { return false; } } }