Em maio deste ano, o Google anunciou suporte PHP para o Google App Engine (GAE). PHPStorm, uma ótima IDE para desenvolvimento PHP, também anunciou suporte para o Google App Engine PHP. Por conta disso, é hora de hackear alguns bits com os “novos brinquedinhos”.
Eu já trabalhei em alguns projetos com o Google App Engine no passado (com Python). Com PHP, o processo é quase o mesmo. Primeiro precisamos definir nosso aplicativo no arquivo app.yaml. Em nosso exemplo, iremos redirecionar todas as requisições para o main.php, onde o nosso aplicativo Silex está definido
application: silexgae version: 1 runtime: php api_version: 1 threadsafe: true handlers: - url: .* script: main.php
Criar um simples aplicativo Silex no Google App Engine é bastante objetivo (mais informações aqui). Por causa disso, iremos um pouco adiante. Usaremos framework de login fornecido pelo GAE para logarmos com a nossa conta do Google em nosso aplicativo Silex. Na verdade, podemos usar o processo de autenticação Oauth padrão, mas o Google forneceu uma forma simples de utilizar nossa conta do Gmail.
Agora faremos um LoginProvider para tornar o processo mais simples. Nosso aplicativo Silex de base será o seguinte:
<?php require_once __DIR__ . '/vendor/autoload.php'; use Silex\Application; use Gae\LoginProvider; use Gae\Auth; $app = new Application(); $app->register(new LoginProvider(), array( 'auth.onlogin.callback.url' => '/private', 'auth.onlogout.callback.url' => '/loggedOut', )); /** @var Auth $auth */ $auth = $app['gae.auth'](); $app->get('/', function () use ($app, $auth) { return $auth->isLogged() ? $app->redirect("/private") : "<a href='" . $auth->getLoginUrl() . "'>login</a>"; }); $app->get('/private', function () use ($app, $auth) { return $auth->isLogged() ? "Hello " . $auth->getUser()->getNickname() . " <a href='" . $auth->getLogoutUrl() . "'>logout</a>" : $auth->getRedirectToLogin(); }); $app->get('/loggedOut', function () use ($app) { return "Thank you!"; }); $app->run();
Nosso LoginProvider é uma Class simples que implementa Silex\ServiceProviderInterface
<?php namespace Gae; require_once 'google/appengine/api/users/UserService.php'; use google\appengine\api\users\UserService; use Gae\Auth; use Silex\Application; use Silex\ServiceProviderInterface; class LoginProvider implements ServiceProviderInterface { public function register(Application $app) { $app['gae.auth'] = $app->protect(function () use ($app) { return new Auth($app, UserService::getCurrentUser()); }); } public function boot(Application $app) { } }
Como podemos ver, nossa classe Provider nos fornece uma instância da classe Gae\Auth
<?php namespace Gae; require_once 'google/appengine/api/users/UserService.php'; use google\appengine\api\users\User; use google\appengine\api\users\UserService; use Symfony\Component\HttpFoundation\RedirectResponse; use Silex\Application; class Auth { private $user = null; private $loginUrl; private $logoutUrl; private $logged; public function __construct(Application $app, User $user=null) { $this->user = $user; if (is_null($user)) { $this->loginUrl = UserService::createLoginUrl($app['auth.onlogin.callback.url']); $this->logged = false; } else { $this->logged = true; $this->logoutUrl = UserService::createLogoutUrl($app['auth.onlogout.callback.url']); } } /** * @return RedirectResponse */ public function getRedirectToLogin() { return new RedirectResponse($this->getLoginUrl()); } /** * @return boolean */ public function isLogged() { return $this->logged; } /** * @return string */ public function getLoginUrl() { return $this->loginUrl; } /** * @return string */ public function getLogoutUrl() { return $this->logoutUrl; } /** * @return \google\appengine\api\users\User|null */ public function getUser() { return $this->user; } }
E é só isso. O código completo está disponível na minha conta do github, e você também pode utilizar o composer para incluir este serviço dentro dos seus projetos.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://gonzalo123.com/2013/05/20/google-app-engine-php-and-silex-setting-up-a-login-provider/