Integre Redes Sociais nas Nuvens com o Framework Play

Propaganda
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ções
</a><br/>
<a href=”@{Comentarios.index}”>Comentários
</a><br/>
<a href=”@{Usuarios.index}”>Usuá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
Download