play_ Integre Redes Sociais nas Nuvens com o Framework Play Use as redes sociais no seu sistema Play e faça o deploy nas nuvens de maneira totalmente gratuita. N a edição 57 mostramos como criar uma aplicação simples utilizando o framework Play. Se não conseguiu ler esse artigo, não se preocupe, os conceitos básicos estão disponíveis no site, e será possível executar a aplicação de exemplo sem conhecimento prévio. Nesta edição será explicado e exemplificado com detalhes dois aspectos importantes de sua aplicação, em primeiro lugar como se integrar nas redes sociais (Facebook), e depois como colocar para rodar nas nuvens (Heroku). Projeto de exemplo O projeto que utilizaremos será o NetCitacoes, mesmo da edição 57, mas as instruções podem ser aplicadas à sua aplicação sem que você precise se preocupar com o projeto que utilizamos. O link para download do projeto está nas referências no final do artigo. Escolhendo o módulo A maioria dos grandes sites que acessamos não usa um mecanismo próprio de autenticação, e sim alguns já famosos do mercado, como o OpenID, usado pelo Yahoo!, ou o OAuth2 usado pelo GitHub e Facebook. Acessando a url www.playframework.com/modu- / 48 les você encontrará várias opções de módulos que fazem integração com Facebook, Twitter, Linkedin etc, e também encontrará opções que fazem integrações com os mecanismos de autenticação OAuth versão 1 e 2, OpenID, entre outros. Existem mais de 130 módulos, o melhor a fazer é identificar quais que atendem às suas necessidades de projeto. O módulo que vamos usar neste artigo chama-se Secure Social. Instalando o módulo Secure Social Primeiramente, precisamos instalar e baixar as dependências necessárias para a execução do módulo, para isso edite no seu projeto o arquivo dependencies.yml Adicione a seguinte linha ao final do arquivo. - play -> securesocial {versao} onde, {versao} deverá ser substituído pela versão do módulo desejado. Usaremos para esse exemplo a versão 0.2.6, então a linha que devemos adicionar no arquivo ficará dessa forma: - play -> securesocial 0.2.6 Não utilize a tecla TAB para identação do arquivo, caso contrário, ao tentar instalar as dependências, será exibida mensagem de erro. No projeto NetCitacoes da edição 57, utilizamos o módulo Secure, porém com o módulo SecureSocial Eduardo Cerqueira | [email protected] formado pela Universidade Ibirapuera, trabalha com java desde 2005 e sócio-diretor da WebStart Solutions, empresa com foco na prestação de serviços de desenvolvimento de software, atualmente trabalhando no desenvolvimento de startups. Fernando Boaglio | [email protected] formado pela Unesp em BCC, foi instrutor oficial da Sun Microsystems e da Oracle Education. Atualmente contribui para alguns projetos open source, como KDE e Mentawai, e é da equipe de arquitetura da Discover Technology, prestando serviços para a Tokio Marine Seguradora. Depois da visão geral do Play Framework na MundoJ 57, vamos partir para opções mais avançadas. Como deixar o seu site popular se ele não se integra às principais redes sociais? E para publicá-lo em um ambiente robusto, no seu servidor de aplicação preferido ou nas nuvens, como proceder? Segure os seus commits e prepare-se para enriquecer sua aplicação rapidamente! não precisaremos mais dele, então a linha que se refere ao módulo Secure poderá ser excluída. Salve o arquivo agora no terminar, dentro do diretório do projeto. Execute o comando: play deps --sync Esse comando fará a leitura das informações contidas no arquivo dependencies.yml e efetuará o download dos arquivos necessários para serem utilizados no seu projeto (será exibida uma saída semelhante à Listagem 1 ). Listagem 1. Saída do comando play deps –sync. $ play deps --sync ~ _ _ ~ _ __ | | __ _ _ _| | ~ | ‘_ \| |/ _’ | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.2.5, http://www.playframework.org ~ ~ Resolving dependencies using /Users/eduardocerqueira/ materiaMJ/NetCitacoes/conf/dependencies.yml, ~~ play->scaffold head (from playContributedModules) ~ play->securesocial 0.2.6 (from playContributedModules) ~ ~ Downloading required dependencies, ~ ~ downloaded http://www.playframework.org/modules/ securesocial-0.2.6.zip ~ ~ Installing resolved dependencies, ~ ~ modules/scaffold-head ~ modules/secure -> /Users/eduardocerqueira/projetos/ ambiente/play-1.2.5/modules/secure ~ modules/securesocial-0.2.6 ~ ~ Done! ~ Após o término do download, precisamos incluir as bibliotecas no projeto e no build path, para isso, execute o comando: play eclipsify Pronto, já instalamos o módulo necessário e também já configuramos nosso projeto para utilização do mesmo. 49 \ É possível que algumas classes fiquem com erro de compilação, isso acontece porque existem várias referências ao módulo secure que não estamos utilizando mais, por esse motivo, as linhas com erro poderão ser comentadas sem qualquer problema. Agora, precisamos adicionar algumas diretrizes para que o módulo instalado seja efetivamente utilizado pela aplicação. Nessa etapa, precisaremos editar o arquivo conf/ application.conf para informar ao módulo quais as redes sociais e, consequentemente, os protocolos e as chaves de acesso a essas redes que serão utilizados. Para obtenção das chaves, cada serviço possui uma forma diferente, mas utilizando o Facebook como exemplo, precisamos acessar o endereço http:// developers.facebook.com e configurar uma nova aplicação. A explicação de como configurar uma nova aplicação não está dentro do escopo deste artigo (a edição 55 no artigo “Integrando Aplicações Java com o Facebook” mostrou como fazer isso), mas acessando o endereço acima, não será nenhum desafio, acredite! Depois de criada a sua aplicação, o Facebook fornece uma identificação da sua aplicação (App ID) e um código secreto (App Secret), apenas para garantir que é você mesmo que está usando essa aplicação e mais ninguém. Essas mesmas informações precisaremos para configurar o NetCitacoes. Edite o arquivo conf/application.conf e inclua as informações da Listagem 2. As propriedades securesocial.facebook.authorizationURL e securesocial.facebook.accessTokenURL não precisam ser alteradas e referem-se ao endereço utilizado pelo Facebook para realizar autorização e verificação de token de acesso, bem auto-explicativo. Agora utilizaremos as informações que o Facebook nos forneceu para editar as propriedades securesocial.facebook.clientid e securesocial. facebook.secret substituindo os valores APP_ID e SECRET_APP por seus respectivos valores fornecidos quando criamos a nossa aplicação (App ID e App Secret, lembre-se que eles garantem que a aplicação foi criada exclusivamente por você). Na propriedade securesocial.logout.redirect informamos a action que será chamada quando o usuário efetuar logout no site. No nosso caso, estou executando a action que retorna para o ponto de entrada da aplicação. O Secure Social, além da autenticação, também proporciona o cadastro de usuário no seu sistema e ativação do mesmo por e-mail. Para configurar essa opção, informe duas propriedades: securesocial. mailer.subject, que é o assunto para o e-mail de ativação e securesocial.mailer.from, que define qual o endereço de e-mail remetente (From). Para finalizarmos a configuração do módulo, edite o arquivo conf/routes e troque o módulo de autenticação que usamos no artigo anterior, de secure para securesocial, conforme a última linha da Listagem 3. Listagem 2. Itens de configuração do módulo Secu- Listagem 3. Arquivo routes. reSocial. securesocial.providers=facebook,userpass securesocial.facebook.authorizationURL= https://graph.facebook.com/oauth/authorize securesocial.facebook.accessTokenURL= https://graph.facebook.com/oauth/access_token securesocial.facebook.clientid=APP_ID securesocial.facebook.secret=SECRET_APP securesocial.facebook.scope=email securesocial.mailer.subject=Ative a sua conta [email protected] securesocial.logout.redirect=Application.index # Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index GET /listarComentarios/{id} Comentarios.listar # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the / public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}. {action} # Secure social * /auth module:securesocial Aqui tem uma série de informações que precisamos comentar, mas que de certa forma são auto-explicativas. A propriedade securesocial.providers é responsável por dizer ao módulo quais os provedores de login utilizaremos na aplicação, como pode ser observado, mais de um provedor pode ser configurado para Adicionando segurança aos controllers ser utilizado em conjunto. Usaremos os provedores No SecureSocial, podemos definir se nossas clasde login do Facebook e o nosso velho conhecido pases de controle terão acesso público ou restrito, que drão login e senha. / 50 precisam de autenticações do usuário. Para informar ao módulo qual tipo de acesso uma classe controller terá, usaremos a anotação de classe @With() informando qual a classe que será aplicada. Para classes de acesso público utilizamos a anotação com a classe SecureSocialPublic.java e para acesso restrito, usamos a classe SecureSocial.java Baseado nesse conceito, alteramos a classe Application.java para usar a classe que permite o acesso público, para isso abra o arquivo Application.java e inclua a anotação de classe @ With(SecureSocialPublic.class) conforme Listagem 4. Listagem 4. Classe Application.class. package controllers; import play.mvc.Controller; import play.mvc.With; import controllers.securesocial.SecureSocialPublic; @With(SecureSocialPublic.class) public class Application extends Controller { public static void index() { render(); } public static void sair() throws Throwable { index(); } } Agora, precisamos alterar as classes que terão acesso restrito e, por consequência, deverão redirecionar para a tela de login, caso sejam acessadas. Iremos alterar a classe Usuarios conforme a Listagem 5. Listagem 5. Classes Usuarios. ackage controllers; import java.util.List; import models.Usuario; import play.data.validation.Valid; import play.i18n.Messages; import play.mvc.Before; import play.mvc.Controller; import play.mvc.With; import controllers.securesocial.SecureSocial; @With(SecureSocial.class) public class Usuarios extends Controller { @Before static void user() { } p public static void index() { List<Usuario> entities = models.Usuario.all().fetch(); render(entities); } } public static void create(Usuario entity) { render(entity); } public static void show(java.lang.Long id) { Usuario entity = Usuario.findById(id); render(entity); } public static void edit(java.lang.Long id) { Usuario entity = Usuario.findById(id); render(entity); } public static void delete(java.lang.Long id) { Usuario entity = Usuario.findById(id); entity.delete(); index(); } public static void save(@Valid Usuario entity) { if (validation.hasErrors()) { flash.error(Messages.get(“scaffold.validation”)); render(“@create”, entity); } entity.save(); flash.success(Messages.get(“scaffold.created”, “Usuario”)); index(); } public static void update(@Valid Usuario entity) { if (validation.hasErrors()) { flash.error(Messages.get(“scaffold.validation”)); render(“@edit”, entity); } entity = entity.merge(); entity.save(); flash.success(Messages.get(“scaffold.updated”, “Usuario”)); index(); } Ajustando a segurança nas views Como estamos usando o módulo Secure Social, no arquivo index.html precisamos remover algumas linhas que tínhamos com referência ao módulo secure antigo (duas linhas com secure.check), então edite esse arquivo conforme a Listagem 6. Listagem 6. Alteração no arquivo index.html. #{extends ‘main.html’/} <h2>Controllers</h2> <a href=”@{Citacaos.index}”>Cita&ccedil;&otilde;es </a><br/> <a href=”@{Comentarios.index}”>Coment&aacute;rios </a><br/> <a href=”@{Usuarios.index}”>Usu&aacute;rios</a><br/> #{list citacoes, as:’citacao’} ${citacao.descricao} #{/list} 51 \ Acessando a aplicação e testando o funcionamento play run --%producao Pronto, agora com tudo configurado, basta exe- Ao executar em um ambiente de produção, o hot deploy é desativado e antes de subir todos os fontes cutar o servidor do play com o comando: Java e os templates são compilados. play run A facilidade do Play também está na publicação E acessar a URL de entrada da aplicação: (deploy). Nas referências você encontra o link da dohttp://localhost:9000 cumentação oficial com os principais ambientes, aqui teremos as três opções mais utilizadas. 1. Standalone (apenas na sua máquina) Ao acessar o sistema, não será solicitado nenhum Para publicar em uma só máquina ou em uma login, pois está com acesso público na controller, porém ao acessar o item de menu usuários, será exibida rede pequena, a melhor alternativa é utilizar o servidor disponível dentro do play o mesmo que é utilizauma tela semelhante à figura 1. do para o desenvolvimento, apenas suba a aplicação com play run. Esse servidor embutido no play suporta milhares de requisições simultâneas, e com certeza não será o gargalo de seu sistema. 2. Em um servidor Java EE O play consegue exportar sua aplicação para os principais contêiners JEE do mercado, como JBoss, Jetty, Tomcat, Websphere e Glassfish. play war netcitacoes -o netcitacoes.war --zip Figura 1. Tela de usuários acessando o sistema com integração ao Facebook. Ao clicar no ícone do Facebook, a aplicação utilizará o login integrado para identificar o usuário, caso ele preencha as informações nos campos de username e password, o sistema buscará as informações no banco de dados da própria aplicação. Publicando sua aplicação É muito comum termos uma configuração diferente em desenvolvimento e produção, não só as senhas de banco, mas algumas vezes em desenvolvimento é MySQL e em produção Oracle. No play todas as configurações ficam no application.conf, e com um prefixo conseguimos diferenciar os ambientes. Exemplo: %producao.application.mode=prod db=mem %producao.db=postgres://postgres:postgres@localhost/ netcitacoes E as bibliotecas do Hibernate? E as bibliotecas dos drivers do banco de dados? Não se preocupe, de acordo com o que está configurado no arquivo de configuração, o play gera o pacote com todas as dependências necessárias. 3. Nas nuvens O Heroku.com é um excelente provedor de serviços que permite a publicação gratuita de sua aplicação em Play, desde que obedeça a algumas restrições. Para publicarmos o NetCitacoes, precisamos fazer alguns ajustes para o novo ambiente: a. as publicações funcionam via Git, portanto é necessária a instalação do cliente do controle de versão Git (veja nas referências onde baixar). b. converter o seu banco de dados para o PostgreSQL. É bem mais simples do que parece, vamos começar entrando no Heroku utilizando a linha de comando: > heroku auth:login Enter your Heroku credentials. Email: [email protected] Password (typing will be hidden): Authentication successful. Nesse exemplo, temos no ambiente de desenvolvimento sem banco de dados (usando Agora vamos criar o nosso ambiente no servidor: na verdade HSQL internamente) e em produção dentro do diretório do NetCitacoes digite: PostgreSQL. > heroku create Para executar essa aplicação no ambiente de de- creating pure-badlands-1151... done stack is cedar senvolvimento, faça o de sempre: play run Para executar a aplicação em produção, especifique na linha de comando o ambiente desejado: / 52 http://pure-badlands-1151.herokuapp.com/ | git@heroku. com:pure-badlands-1151.git Git remote heroku added Foi criado o ambiente lá no Heroku, e o diretório do Vamos adicionar o suporte ao PostgreSQL versão seu projeto no Git foi ligado ao do servidor, para poder gratuita de desenvolvimento (limite de 10000 linhas): publicar sua aplicação. Como esse nome aleatório não é interessante, vamos renomear para um nome > heroku addons:add heroku-postgresql:dev Adding heroku-postgresql:dev on netcitacoes... done mais amigável: > heroku apps:rename netcitacoes Renaming pure-badlands-1151 to netcitacoes... done Se você não está acostumado com linha de comando, não se preocupe, tudo o que fizermos até agora pode ser feito via web browser conforme a figura 2. v3 (free) Attached as HEROKU_POSTGRESQL_PINK_URL Database has been created and is available ! This database is empty. If upgrading you can transfer ! data from another database with pgbackups:restore. Use `heroku addons:docs heroku-postgresql:dev` to view documentation. Vamos importar as nossas tabelas para o servidor (o script cria-banco.sql está junto com o código-fonte, consulte as referências no final do artigo): >psql -h compute-1.amazonaws.com -U jihxebfy -d dvju -p 5432 < cria-banco.sql Senha para usuário jihxebfy: CREATE TABLE ... ALTER TABLE Figura 2. Renomeando a aplicação NetCitações no Heroku. A partir de agora o subdomínio http://netcitacoes. herokuapp.com/ está registrado para a nossa aplicação, mas sem nenhuma aplicação por enquanto (conforme figura 3). Isso significa que o nosso ambiente está pronto, só aguardando uma publicação do nosso lado, que será feita via git. No conceito de nuvem, as aplicações funcionam com o mínimo possível e qualquer coisa que for necessário é preciso adicionar o módulo específico. Por exemplo, se a sua aplicação vai mandar e-mails, é preciso adicionar um módulo para isso (por exemplo, o Mailgun). Como precisamos de um banco de dados, vamos adicionar uma opção gratuita. Depois do banco de dados pronto, vamos configurar o servidor de aplicação. Ao contrário dos provedores que acessamos remotamente, aqui especificamos o que o servidor deve fazer em um arquivo de comandos, chamado Procfile. No nosso caso vamos colocar a instrução de subir uma aplicação em Play, portanto o arquivo contém apenas uma linha: web: play run --http.port=$PORT $PLAY_OPTS Agora faça o deploy de sua aplicação... FTP ? SSH? Copiar arquivos? Reiniciar servidor web? Não precisa! O git faz tudo isso para você com uma linha de comando: Figura 3. Subdomínio registrado no Heroku sem nenhuma aplicaçã., 53 \ fb@cascao ~/workspace-play/NetCitacoes [18:23:21]> git push heroku master Counting objects: 398 done. Delta compression using up to 4 threads. Compressing objects: 100% (221/221) done. Writing objects: 100% (398/398) 203.02 KiB | 211 KiB/s done. Total 398 (delta 153) reused 385 (delta 150) -----> Play! app detected -----> Installing OpenJDK 1.6...done -----> Installing Play! 1.2.5..... ... -----> Launching... done v6 http://netcitacoes.herokuapp.com deployed to Heroku To [email protected]:netcitacoes.git * [new branch] master -> master Perceba o que aconteceu, o git pegou os seus arquivos e mandou para o servidor do Heroku, depois disso o servidor leu a linha de comando do arquivo Procfile e subiu a sua aplicação, simples assim. Agora está disponível a aplicação na nuvem do Heroku pelo endereço: http://netcitacoes.herokuapp. com (figura 4). Com essa postura dos responsáveis do Play, talvez o branch instável 1.3.0 nunca fique pronto, pois existe essa tendência quase que imposta que nos leva à nova versão, apesar dos problemas reportados todos os dias na lista de discussão oficial. Se não desejar aprender Scala e continuar no Java, não se preocupe! A maioria dos usuários continua na versão um e a Typesafe promete deixar a utilização da nova versão mais atraente para programadores Java. Considerações finais O framework Play é bastante extensível e provê de forma fácil acesso a facilidades que normalmente demandariam muito esforço para serem realizados manualmente em Java. Essas e muitas outras facilidades estão disponíveis para serem utilizadas sem muita complicação resultando em muita produtividade com baixo esforço para serem implementados. Após um roteiro de integração de uma aplicação Play integrar-se ao Facebook com poucas configurações, foi demonstrado também como publicar a sua aplicação na sua rede social ou nas nuvens no Heroku. O código-fonte e demais referências estão no final do artigo. Vale a pena dar uma olhada em outros módulos que o framework disponibiliza no site do projeto e tirar o máximo proveito do Play. Um grande abraço a todos e até a próxima! /referências > https://github.com/egcerqueira/NetCitacoes - códigofonte do exemplo do artigo Figura 4. Aplicação NetCitações nas nuvens. > http://tinyurl.com/playdeploy - documentação oficial para publicação de aplicações E o Play 2.x? Acessando o site oficial do Play Framework, parece que a primeira versão é coisa do passado distante e que a nova versão 2 está pronta para produção. Não é bem assim, para resumir a história o principal responsável pelo framework Play agora trabalha para a Typesafe, a empresa que mantém a linguagem Scala e vende produtos e serviços. Portanto, o Play 2 foi totalmente reescrito em Scala e o Play em Java colocado em segundo plano. Apesar do esforço da equipe da Typesafe, a adesão à nova versão pelos mantenedores dos módulos é muito baixa, e juntando com o pré-requisito de programar em Scala, atualmente essa versão não é muito popular. / 54 > http://tinyurl.com/playprod - documentação oficial para ambiente de produção > http://git-scm.com/downloads - download do Git para Windows, MacOS e Linux > http://tinyurl.com/playheroku - documentação do Play no Heroku > http://playdocpt.herokuapp.com/ - tradução da documentação do Play em português > http://tinyurl.com/listaplay - lista de discussão oficial do Play