Como gerenciar sessões com identidades externas

Neste artigo, você aprenderá como gerenciar sessões com o Identity-Aware Proxy (IAP) ao usar identidades externas para fins de autenticação.

Como atualizar as sessões

As sessões do Identity Platform têm validade de uma hora. Quando uma sessão expira, seu app precisa redirecionar para a página de autenticação. A página de autenticação contém o token de atualização do Identity Platform. Contanto que a credencial do usuário ainda seja válida, é possível usá-la para fazer a autenticação novamente, sem a necessidade de exibir qualquer IU.

No entanto, se o usuário alterou o e-mail ou a senha há pouco tempo ou se ocorreu alguma outra ação que revogou o token, esse usuário precisará concluir o fluxo de autenticação novamente.

Como processar solicitações não AJAX

As solicitações não AJAX são processadas automaticamente usando um redirecionamento de aplicativo, desde que a página de autenticação esteja configurada corretamente.

Como processar solicitações AJAX

O Chrome e outros navegadores estão desativando os cookies de terceiros. As recomendações para fazer solicitações AJAX nesta página não vão funcionar se os cookies de terceiros estiverem desativados. No entanto, as recomendações fornecidas vão continuar funcionando se a origem e o destino das solicitações AJAX forem do mesmo site.

Para instruções sobre como gerenciar cookies de terceiros no Chrome, consulte Excluir, permitir e gerenciar cookies no Chrome.

Se você enviar uma solicitação AJAX com um token expirado, ela retornará um código de status 401: Unauthorized. Implemente uma das soluções a seguir para resolver isso:

  • Modifique o código do aplicativo para que ele processe códigos de status HTTP 401.
  • Inclua um iframe no aplicativo para que ele aponte para o atualizador de sessão.
  • Instrua os usuários a carregar manualmente o atualizador de sessão em uma guia diferente.

Se você está recebendo um código de status 302, em vez de 401, como resposta às solicitações AJAX, inclua um cabeçalho X-Requested-With com um valor de XMLHttpRequest. Isso informa ao IAP que a solicitação é originária do JavaScript.

Como processar o código de status HTTP 401 de forma programática

Processar códigos de status HTTP 401 de maneira programática é a abordagem recomendável para atualizar uma sessão AJAX. Para fazer isso:

  1. Atualize o código do aplicativo para que ele processe o erro.

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

  2. Inclua um gerenciador que abra uma janela para autenticar novamente o usuário e 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) {
        fetch('/favicon.ico').then(function(response) {
          if (response.status === 401) {
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

Como usar um iframe

Se você não conseguir processar o código HTTP 401 de maneira programática, a melhor solução é incluir um iframe no aplicativo que aponte para o atualizador de sessão.

O uso de um iframe exige que você configure uma página de login personalizada no mesmo domínio do app da Web protegido pelo IAP. Caso contrário, os usuários vão encontrar erros de origem cruzada. Para mais informações sobre a configuração da página de login, consulte Criar uma página de login personalizada.

Exemplo de uso 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>

Como carregar o atualizador de sessão

Como último recurso, é possível instruir seus usuários a carregar manualmente o atualizador de sessão. Inclua essa orientação no seu aplicativo ou na respectiva documentação, instruindo os usuários a abrir o URL a seguir em uma guia diferente:

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

Como desconectar os usuários

Para desconectar um usuário de um recurso IAP, use o parâmetro de consulta ?gcp-iap-mode=GCIP_SIGNOUT. Por exemplo, em um aplicativo do App Engine, o URL é semelhante a este:

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

Os usuários serão redirecionados para a página de login após serem desconectados.

Para desconectar um usuário de todos os recursos e sessões, redirecione-o para seu URL de autenticação com a chave de API e mode=signout anexados como parâmetros. Exemplo:

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

Os usuários permanecerão na página após serem desconectados. Pense em implementar o callback completeSignOut() no objeto AuthenticationHandler para informar ao usuário que ele foi desconectado.

Como alternar entre locatários

Em alguns casos, um usuário pode querer autenticar com vários locatários no mesmo recurso do IAP. Por exemplo, ele pode pertencer a vários locatários que concedem níveis de acesso diferentes e querer mudar para um com menos ou mais privilégios.

Para forçar a reinicialização no processo de seleção de locatário, use ?gcp-iap-mode=CLEAR_LOGIN_COOKIE. Por exemplo, em um aplicativo do App Engine, o URL é semelhante a este:

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

A seguir