Gerir sessões com identidades externas

Este artigo explica como gerir sessões com o Identity-Aware Proxy (IAP) se estiver a usar identidades externas para autenticação.

A atualizar sessões

As sessões da Identity Platform são válidas durante uma hora. Quando uma sessão expira, a sua app tem de fazer o redirecionamento para a página de autenticação. A página de autenticação contém o token de atualização do Identity Platform. Enquanto a credencial do utilizador continuar a ser válida, pode usá-la para reautenticação sem apresentar qualquer IU.

Se o utilizador alterou recentemente o email ou a palavra-passe, ou ocorreu alguma outra ação que revogou o respetivo token, tem de concluir novamente o fluxo de autenticação.

Processar pedidos não AJAX

Os pedidos não AJAX são processados automaticamente através de um redirecionamento da aplicação, partindo do princípio de que a página de autenticação está configurada corretamente.

Processar pedidos AJAX

O Chrome e outros navegadores estão a remover os cookies de terceiros. As recomendações para fazer pedidos AJAX nesta página não funcionam se os cookies de terceiros estiverem desativados. No entanto, as recomendações fornecidas vão permanecer funcionais se a origem e o destino dos pedidos AJAX forem do mesmo site.

Para instruções sobre como gerir cookies de terceiros no Chrome, consulte o artigo Elimine, permita e faça a gestão de cookies no Chrome.

Se enviar um pedido AJAX com um token expirado, o pedido devolve um código de estado 401: Unauthorized. Implemente uma das seguintes soluções para resolver este problema:

  • Modifique o código da aplicação para processar os códigos de estado HTTP 401.
  • Adicione um iframe à sua aplicação para apontar para a atualização da sessão.
  • Indique aos utilizadores que carreguem manualmente a atualização da sessão num separador separado.

Se estiver a receber um código de estado 302 em vez de 401 em resposta a pedidos AJAX, adicione um cabeçalho X-Requested-With com um valor de XMLHttpRequest. Isto informa a IAP de que o pedido tem origem no JavaScript.

Processamento programático de HTTP 401

O processamento programático de códigos de estado HTTP 401 é a forma recomendada de atualizar uma sessão AJAX. Para o fazer:

  1. Atualize o código da aplicação para processar o erro.

    if (response.status === 401) {
      statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
    }

  2. Adicione um controlador que abra uma janela para reautenticar o utilizador e, em seguida, feche-a quando o processo for concluído.

    var iapSessionRefreshWindow = null;
    
    function sessionRefreshClicked() {
      if (iapSessionRefreshWindow == null) {
        iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
        window.setTimeout(checkSessionRefresh, 500);
      }
      return false;
    }
    
    function checkSessionRefresh() {
      if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
        // Attempting to start a new session.
        // XMLHttpRequests is used by the server to identify AJAX requests
        fetch('/favicon.ico', {
              method: "GET",
              credentials: 'include',
              headers: {
                  'X-Requested-With': 'XMLHttpRequest'
              }
        .then((response) => {
          // Checking if browser has a session for the requested app
          if (response.status === 401) {
            // No new session detected. Try to get a session again
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            // Session retrieved.
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        })
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

Usar um iFrame

Se não conseguir processar o HTTP 401 de forma programática, a melhor solução seguinte é adicionar um iframe à sua aplicação que aponte para a atualização da sessão.

A utilização de um iFrame requer a configuração de uma página de início de sessão personalizada no mesmo domínio que a app Web protegida por IAP. Caso contrário, os utilizadores vão encontrar erros de origem cruzada. Para mais informações sobre a configuração da página de início de sessão, consulte o artigo Crie uma página de início de sessão personalizada.

Exemplo de utilização de um iFrame:

<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>

A carregar a atualização da sessão

Em último recurso, pode dar instruções aos utilizadores para carregarem manualmente a atualização da sessão. Adicione orientações à sua aplicação ou à respetiva documentação que direcionem os utilizadores para abrirem o seguinte URL num separador separado:

https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER

Terminar sessão dos utilizadores

Para terminar a sessão de um utilizador num recurso de IAP, use o parâmetro de consulta ?gcp-iap-mode=GCIP_SIGNOUT. Por exemplo, numa app do App Engine, o URL tem o seguinte aspeto:

https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT

Os utilizadores são redirecionados de volta para a página de início de sessão depois de terminarem sessão.

Para terminar a sessão de um utilizador em todos os recursos e sessões, redirecione-o para o seu URL de autenticação com a sua chave da API e mode=signout anexados como parâmetros. Por exemplo:

https://auth.example.com/?apiKey=API-KEY&mode=signout

Os utilizadores permanecem na página depois de terminarem sessão. Pondere implementar o callback completeSignOut() no objeto AuthenticationHandler para dar feedback ao utilizador de que terminou sessão com êxito.

Alternar entre inquilinos

Em alguns casos, um utilizador pode querer autenticar-se com vários inquilinos para o mesmo recurso de IAP. Por exemplo, podem pertencer a vários inquilinos que concedem diferentes níveis de acesso e querer mudar para um inquilino com menos ou mais privilégios.

Para forçar o reinício do processo de seleção do inquilino, use ?gcp-iap-mode=CLEAR_LOGIN_COOKIE. Por exemplo, numa app do App Engine, o URL pode ter o seguinte aspeto:

https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE

O que se segue?