Como autenticar usuários com Java no ambiente padrão do App Engine

Esta parte do tutorial Bookshelf para Java mostra como criar um fluxo de entrada para usuários que possuem contas do Google e como usar informações de perfil para fornecer funcionalidade personalizada aos usuários.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, consulte App Bookshelf em Java.

Execução do app na máquina local

Para executar o app localmente:

  1. No diretório getting-started-java/bookshelf-standard/4-auth, digite o seguinte comando para iniciar um servidor da Web local:

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    Substitua [YOUR_BUCKET] pelo nome do seu bucket.
  2. No seu navegador da Web, acesse http://localhost:8080.

Agora navegue nas páginas da Web do app, faça login usando sua Conta do Google e adicione livros. Para vê-los, basta usar o link My Books na barra de navegação superior.

Como implantar o app no ambiente padrão do App Engine

Para implantar no ambiente padrão do App Engine:

  1. Para criar um índice do armazenamento de dados carregado no aplicativo Bookshelf, crie pelo menos um livro e clique em Meus Livros. Observe que a criação do aplicativo usando o comando clean exclui esse índice local. Faça isso na construção do aplicativo que você irá implantar.
  2. No diretório getting-started-java/bookshelf-standard/4-auth, digite este comando para implantar o app:
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    Substitua [YOUR-PROJECT-ID] pelo código do projeto e [YOUR-VERSION] pela versão, por exemplo, 1, 2 ou outro valor de string que você queira usar.
  4. No navegador da Web, digite este URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Substitua:

Depois de atualizar seu aplicativo, você pode reimplementar a versão atualizada digitando o mesmo comando de quando o aplicativo foi implantado pela primeira vez, além de especificar o mesmo ID e versão do projeto. Isso substitui o aplicativo implantado no momento. Se você especificar uma sequência de versão diferente na linha de comando atualizada, a nova implantação criará uma nova versão do seu aplicativo e promoverá que ela seja a versão atualmente veiculada.

Reduza custos excluindo as versões do app que não estão veiculadas.

Para excluir uma versão do app:

  1. No Console do Cloud, acesse a página Versões do App Engine.

    Acessar a página "Versões"

  2. Marque a caixa de seleção da versão não padrão do app que você quer excluir.
  3. Clique em Excluir para remover a versão do app.

Para informações detalhadas sobre a remoção de recursos faturáveis, consulte a seção Como fazer a limpeza na etapa final deste tutorial.

Estrutura do app

O diagrama a seguir mostra os componentes do aplicativo e como eles se conectam.

Auth sample structure

Como entender o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

Quando o usuário clica em Login, o LoginServlet faz o seguinte:

  1. Determina se o usuário está atualmente conectado a uma conta do Google e, em caso afirmativo, salva as informações de e-mail e ID do usuário na sessão atual.

  2. Se não estiver conectado em uma Conta do Google, o usuário é redirecionado a uma página de login de Contas do Google. O serviço Usuários do App Engine lida com a maior parte das complexidades do login do usuário.

@SuppressWarnings("serial")
public class LoginServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    UserService userService = UserServiceFactory.getUserService();
    if (userService.isUserLoggedIn()) {
      // Save the relevant profile info and store it in the session.
      User user = userService.getCurrentUser();
      req.getSession().setAttribute("userEmail", user.getEmail());
      req.getSession().setAttribute("userId", user.getUserId());

      String destination = (String) req.getSession().getAttribute("loginDestination");
      if (destination == null) {
        destination = "/books";
      }

      resp.sendRedirect(destination);
    } else {
      resp.sendRedirect(userService.createLoginURL("/login"));
    }
  }
}

LogoutServlet exclui o session e cria um novo:

@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    // you can also make an authenticated request to logout, but here we choose to
    // simply delete the session variables for simplicity
    HttpSession session =  req.getSession(false);
    if (session != null) {
      session.invalidate();
    }
    // rebuild session
    req.getSession();
  }
}