Apps de página única

Com o IBM Cloud® App ID, é possível incluir rapidamente a autorização e a autenticação em seus aplicativos de página única (SPA). Um SPA é executado inteiramente em seu navegador, não tem um back-end que você gerencia e não requer que a página seja recarregada enquanto o aplicativo está em uso. Algumas estruturas comuns que são usadas com SPAs são Angular e React.

O seu app tem um back-end que você controla? O SPA não é o fluxo para você. Tente o fluxo de app da web.

Entendendo o fluxo

Embora seja o padrão atual do setor para SPAs, o grupo de trabalho OAuth não recomenda mais o uso do fluxo implícito devido a várias preocupações com a segurança. Com base em suas recomendações, o site App ID está configurado para usar o fluxo do Código de Autorização com o PKCE.

Fluxo de autorização do
fluxo de autorização de
de página única*

  1. Um usuário tenta efetuar login em seu aplicativo de página única.
  2. O SDK do App ID cria um verificador de código para a solicitação de autorização, que é a versão de texto simples do desafio de código. Juntamente com a solicitação de autorização, o cliente envia o desafio de código e o método de desafio que é usado para codificar o desafio.
  3. O fluxo de autenticação é iniciado pelo App ID em uma nova janela.
  4. O usuário escolhe um provedor de identidade para se autenticar e conclui o processo de conexão.
  5. O SDK do App ID no aplicativo recebe o código de concessão
  6. Então, o SDK faz uma solicitação de XHR para o terminal do token do App ID juntamente com o código de concessão e o verificador de código para obter tokens de acesso e de identidade.

Você está usando a conexão única para o Cloud Directory? É possível usar o SDK do cliente App ID para obter automaticamente um novo par de tokens sem requerer que o usuário se conecte explicitamente. Para obter mais informações, consulte Login silencioso.

Por que código de autorização + PKCE?

Devido à sua natureza, os aplicativos de página única não conseguem armazenar os segredos de forma segura. O fluxo de autorização + PKCE, uma variação do fluxo de códigos de autorização do OAuth 2.0, usa um verificador de código descartável e um desafio em vez de um segredo para abordar o problema. O verificador e o desafio asseguram que a entidade que chama a autorização e os terminais de token sejam os mesmos. Esse processo significa que um invasor não poderia solicitar tokens do servidor de autorização sem também saber o verificador de código.

Embora o fluxo Implícito seja o padrão de mercado atual, várias falhas de segurança podem ser localizadas. Por exemplo, o fluxo implícito usa URIs de redirecionamento para obter tokens, que o fluxo de autorização + PKCE contorna usando uma solicitação de XHR no lugar. Por causa das falhas de segurança, o fluxo implícito não é mais recomendado ou considerado seguro devido aos motivos a seguir:

  • O Fluxo Implícito retorna tokens como parte da URL - como um parâmetro de consulta ou no fragmento de hash. Ao fazer isso, os tokens podem ser interceptados e acessados. Os tokens podem ser salvos nos logs ou no histórico do navegador de um usuário. O histórico ou os logs podem ser armazenados em um serviço de nuvem e enviados para múltiplos dispositivos, o que também aumenta o risco.

  • O fluxo implícito é suscetível a um ataque de URI de red irecionamento, o que significa que um invasor pode substituir um URI de redirecionamento aprovado por um destino de sua escolha. Se houver um ataque de URI de redirecionamento, os usuários seguirão o link mudado para autorizar seus clientes. Após a autorização, eles são redirecionados para o URI do invasor, o que dá a ele acesso aos tokens legítimos do usuário.

Os exemplos anteriores são apenas alguns dos problemas importantes. Para obter mais informações, consulte OAuth 2.0 melhores práticas atuais de segurança.

Antes de Iniciar

Antes de começar, certifique-se de que você tenha os pré-requisitos a seguir.

  • Uma instância de um serviço do App ID.
  • Seus URIs de redirecionamento configurados no painel de serviço do App ID.
  • Um aplicativo de página única. Se você não tem um e deseja experimentar o fluxo, tente fazer o download do aplicativo de amostra na página de visão geral do painel do App ID.

Criando credenciais do aplicativo com a GUI

Suas credenciais são usadas para conectar seu aplicativo ao App ID. Para criar suas credenciais, registre seu app com o App ID.

Nenhum segredo do cliente é retornado em suas credenciais do SPA. Um segredo no fluxo de Autorização + PKCE não é necessário. Você não consegue usar as credenciais regulares de app da web em seu fluxo do SPA.

  1. Conecte-se ao painel do IBM Cloud na região na qual você deseja trabalhar.
  2. Navegue até a guia Aplicativos e clique em Incluir aplicativo.
  3. Dê um nome ao seu aplicativo.
  4. Selecione Aplicativo de página única no menu suspenso Tipo.
  5. Clique em Salvar.
  6. Na tabela, clique em Visualizar credenciais para ver as informações que são necessárias na configuração a seguir.

Criando credenciais do aplicativo com a API

Suas credenciais são usadas para conectar seu aplicativo ao App ID. Para criar suas credenciais, registre seu app com o App ID.

Nenhum segredo do cliente é retornado em suas credenciais do SPA. Um segredo no fluxo de Autorização + PKCE não é necessário. Você não consegue usar as credenciais regulares de app da web em seu fluxo do SPA.

  1. Faça a seguinte solicitação de postagem para o /management/v4/Terminal do /aplicações

    curl -X POST \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/applications/ \
    -H 'accept: application/json' \
    -H 'Authorization: Bearer <IAMToken>' \
    -H 'Content-Type: application/json' \
    -d '{"name": "MySampleSPA", "type": "singlepageapp"}'
    

    Resposta de exemplo:

    {
       "clientId": "<clientID>",
       "tenantId": "<tenantID>",
       "name": "MySampleSPA",
       "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>",
       "type": "singlepageapp"
    }
    

Configurando o SDK do JavaScript

Para instalar o SDK em seu aplicativo, use as etapas a seguir como um guia.

  1. Usando o prompt de comandos, mude para o diretório que contém o seu aplicativo.

  2. Instale o serviço do App ID usando o NPM ou vinculando o CDN em seu arquivo HTML principal.

    • Para usar o NPM, execute o comando a seguir.

      npm install ibmcloud-appid-js
      
    • Para incluir o CDN, inclua o link a seguir em seu arquivo HTML principal.

      <script src="https://cdn.appid.cloud.ibm.com/appid-0.3.0.min.js"></script>
      
  3. Inclua seu ID de cliente e terminal de descoberta em seu app para inicializar o SDK.

    const appID = new AppID();
    await appID.init({
       clientId: '<spaClientID>',
       discoveryEndpoint: '<wellKnownEndpoint>'
    });
    
  4. Em seu código do aplicativo, após a configuração do seu botão de login, inclua uma chamada para signin. Uma janela pop-up é aberta onde um usuário é solicitado a inserir suas credenciais. Depois de uma autenticação bem-sucedida, a tela fecha e o usuário é autenticado.

    const tokens = await appID.signin();
    

Configurando o login silencioso

Quando a conexão única para o Cloud Directory estiver ativada, será possível obter automaticamente novos tokens para um usuário sem que ele tenha que se autenticar novamente usando o login silencioso. Para ativar o login silencioso, use as etapas a seguir como um guia.

Os tokens de atualização não são retornados no fluxo do SPA.

  1. No painel do App ID, navegue para Cloud Directory > Conexão única.

  2. Alterne Ativar conexão única para Ativado.

  3. Clique em Salvar.

  4. Inclua o código a seguir no aplicativo. Certifique-se de configurar seu aplicativo para mostrar o botão de login se o login silencioso falhar.

    const tokens = await appID.silentSignin();
    if (!tokens) {
       document.getElementById('login').addEventListener('click', async () => {
       const tokens = await appID.signin();
       });
    }