Login

Fluxo de autenticação com várias partes

Veja um exemplo específico de um fluxo de autenticação complexo com várias partes e saiba como a Auth0 o simplifica.

multi-party-authentication-flow

O problema

Quando sua empresa depende de colocar rapidamente as aplicações personalizadas em produção, você precisa de uma plataforma IAM projetada por desenvolvedores e para desenvolvedores. Vejamos como a Auth0 facilita a implementação de fluxos de trabalho de identidade sofisticados, colocando as aplicações em produção com mais rapidez, segurança e menos manutenção contínua.

Imagine que você esteja criando o “Lodging Picks”, uma aplicação de viagens B2B SaaS a ser vendida para empresas. Você agrega listas de hospedagem de várias fontes, incluindo hotéis e RoomSMart, um mercado on-line muito semelhante ao AirBnB que combina anfitriões que têm quartos para alugar com viajantes que procuram hospedagem econômica em residências. O desafio: reservar propriedades RoomSMart por meio da API privada1 em nome dos usuários dos clientes, sem manter as credenciais da conta RoomSMart.

  1. Poderíamos ter usado o AirBnB como nosso exemplo, mas não queríamos insinuar que eles estão realmente oferecendo uma API privada para uso de parceiros. Pense no RoomSMart como o AirBnB e que este caso de uso ilustra um cenário de autenticação realista, com várias partes.

Os desafios

O que torna esse fluxo de autenticação com várias partes complexo de implementar? Vejamos as preocupações das partes envolvidas neste cenário:

  • A Empresa deseja obter os benefícios do Lodging Picks para seus negócios, mas deve controlar o acesso à aplicação Lodging Picks para seus funcionários e deseja torná-la simples de usar. Assim, a empresa deseja integrar o Lodging Picks à infraestrutura de SSO e deve ser capaz de provisionar e desprovisionar funcionários no Lodging Picks quando eles entram e saem da empresa.
  • O Funcionário deseja reservar hospedagem através da aplicação, incluindo quartos RoomSMart, mas precisa controlar o acesso do Lodging Picks à sua conta RoomSMart. Em particular, o Lodging Picks deve ter acesso limitado para reservar quartos usando o método de pagamento padrão de sua conta e não para avaliar anfitriões, enviar mensagens ou alterar perfis ou informações de pagamento. Além disso, o funcionário deve ser capaz de revogar o acesso em caso de problemas e manter o perfil do RoomSMart privado.
  • A Lodging Picks deseja oferecer um serviço valioso para seus clientes corporativos, com uma ótima experiência de SSO para usuários corporativos e um novo canal para o RoomSMart. Mas em um mundo onde as violações de segurança são notícias de primeira página comuns, o Lodging Picks precisa intermediar essas transações, minimizando a confiança exigida das partes participantes. A menos que todos se sintam seguros de que suas informações valiosas estão seguras e sob seu controle, os riscos de usar esta aplicação SaaS podem exceder os benefícios.
  • A RoomSMart quer adicionar um novo canal B2B às suas vendas. Mas seu negócio é baseado na confiança: os anfitriões oferecem um quarto de suas casas para estranhos - os hóspedes, e esses hóspedes reservam os quartos com base nas descrições do site e nas avaliações e comentários de outros hóspedes. Tanto os anfitriões quanto os hóspedes salvam informações confidenciais no serviço, e o RoomSMart deve manter a privacidade e cumprir as leis e regulamentos enquanto oferece uma experiência de usuário muito simples. Da mesma forma, ele provavelmente não permite que outras aplicações armazenem credenciais de login, controla rigidamente o acesso à API, dá aos proprietários de informações confidenciais controle total e pode impor seus termos de serviço.

Não apenas parece complicado, é complicado! Mas também é típico das aplicações móveis modernas da Web, criadas por meio da composição de serviços disponíveis na “economia de API” de fontes independentes. Autenticação e autorização são as ferramentas críticas que controlam como esses serviços podem confiar uns nos outros em um ambiente inerentemente não confiável.

Hoje, nenhuma solução lida com fluxos de trabalho de autenticação sofisticados e com várias partes como este usando recursos prontos para uso. Ferramentas com fluxos de autenticação integrados e simples não podem fazer isso. Para implementar o Lodging Picks, pode ser necessário criar manualmente uma solução de IAM personalizada a um custo substancial, contratar talentos especializados e implementar uma manutenção cara e contínua. O que você realmente precisa é de uma plataforma de identidade orientada por API, otimizada para flexibilidade do desenvolvedor e que simplifique as aplicações em que a identidade ultrapassa os limites organizacionais. Você precisa da Auth0.

A solução: Regras de redirecionamento da Auth0

O que precisa acontecer aqui? O usuário – um funcionário do seu cliente – fará login no Lodging Picks usando suas credenciais corporativas federadas. A Auth0 simplifica esse processo, facilitando a implementação de SSO para seus clientes. Assim que um usuário for autenticado, você precisará executar um fluxo de trabalho integrado que permita que o Lodging Picks use a API RoomSMart para visualizar e reservar acomodações RoomSMart em nome do usuário.

Por que não apenas pedir ao usuário para fazer login no Lodging Picks com as credenciais corporativas e do RoomSMart e, em seguida, vincular as contas para que ele possa usar qualquer uma das contas para acessar o Lodging Picks? Essa abordagem não funcionaria: o usuário poderia acessar o Lodging Picks mesmo depois de não ser mais funcionário da empresa, usando o login do RoomSMart. O acesso à aplicação Lodging Picks deve ser feito apenas através da conta empresarial do colaborador, através de SSO.

E se você pedisse ao usuário para salvar o nome e a senha do RoomSMart na aplicação Lodging Picks? Isso pode funcionar, mas vai contra as práticas recomendadas. É muito menos seguro para o RoomSMart e para o funcionário, pode tornar o Lodging Picks um alvo de hackers mais atraente e, portanto, pode ser proibido pelo RoomSMart.

Então, como você pode obter apenas o acesso necessário ao RoomSMart em nome do usuário, sem manter suas credenciais do RoomSMart e autenticar usando apenas a conta corporativa do usuário?

 

Pipeline de regras da Auth0

Figura 1: Regras do pipeline da Auth0

A Auth0 inclui um recurso poderoso – as regras do pipeline de autenticação – que permite adicionar código que é executado após cada autenticação para adicionar processamento personalizado. As regras podem incluir código arbitrário que pode registrar transações, ser vinculado a plataformas analíticas, iniciar autenticação adicional, como a autenticação multifator, ou chamar APIs adicionais para acessar outras informações ou realizar trabalho adicional. As regras podem redirecionar os usuários para sites ou serviços externos e, ao retornar, executar processamento adicional no resultado. Essa capacidade de adicionar qualquer código ao pipeline de autenticação é um dos recursos mais poderosos da Auth0.

Exemplo de página de concessão

Com apenas algumas dezenas de linhas de Javascript, você pode implementar até mesmo um fluxo de trabalho de autenticação multiprotocolo e com várias partes complexo, como aquele do Lodging Picks. Assim, vamos implementar nosso fluxo de trabalho como uma regra (o protótipo do código Javascript está no Apêndice A, no final deste caso de uso). Quando a regra detecta que a Auth0 ainda não salvou um token de atualização para o RoomSMart, como quando um usuário faz login pela primeira vez no Lodging Picks, ela interrompe o processamento de autenticação do usuário e redireciona para a página de concessão da API do RoomSMart. O usuário então concede permissão da Auth0 em nome do Lodging Picks para adquirir e armazenar com segurança um token de atualização de API específico do usuário no perfil do usuário que, por sua vez, pode ser usado para adquirir um token de acesso com direitos de acesso limitados e expiração curta. O Lodging Picks pode chamar a API da Auth0 para recuperar user.app_metadata_encrypted_roomsmart_refresh_token e, após adquirir o token de acesso, realizar pesquisas e reservas no RoomSMart em nome do usuário. O usuário mantém o controle total e pode revogar esse acesso a qualquer momento visitando sua conta do RoomSMart. O RoomSMart também pode revogar o token de atualização ou o token de acesso. Outra regra pode usar automaticamente o token de atualização para adquirir um novo token de acesso antes que o antigo expire.

Exemplo de fluxo de trabalho de autenticação com várias partes

Figura 2: Exemplo de fluxo de trabalho de autenticação com várias partes

Exemplo de aplicação de telefone

As regras de redirecionamento da Auth0 permitem que você interrompa o pipeline de autenticação para chamar qualquer serviço. Você não está limitado ao código que escreveu na aplicação. Com esse poderoso recurso, você pode aproveitar o ecossistema da API da Web ou criar integrações personalizadas para aplicações corporativas.

Confira a documentação e os exemplos abrangentes da Auth0 para saber mais sobre como implementar regras de redirecionamento e dê uma olhada no Apêndice A para ver um protótipo de regra que implementa esse caso de uso específico.

A execução de código arbitrário significa que você tem flexibilidade para compor fluxos de trabalho complexos de autenticação e autorização, sem criar e manter uma solução IAM personalizada. Tudo usando hooks simples e suporte abrangente da plataforma de front-end e back-end da Auth0 para acelerar o desenvolvimento.

Quando chega a hora de implementar as aplicações nativas IOS e Android, seus desenvolvedores podem aproveitar esse fluxo de trabalho de identidade de produção sem nenhum esforço extra – as aplicações móveis usam as mesmas APIs Auth0. Fácil!

Conclusão

Aplicações Web e móveis modernas são compostas por serviços chamados por APIs hospedadas por empresas e entidades independentes. A segurança neste ecossistema de API depende da autenticação – os serviços devem saber que as chamadas para sua API para acesso a informações de identificação pessoal e ações confidenciais são legítimas e aprovadas pelos titulares de suas contas. À medida que as aplicações crescem em complexidade, os padrões de uso e os requisitos de acesso dessas APIs independentes não podem ser previstos com antecedência e incorporados a padrões de design rígidos. A economia da API exige flexibilidade orientada por código ao lidar com fluxos de autenticação. As regras do pipeline de autenticação da Auth0 facilitam a criação desses fluxos personalizados para os desenvolvedores e facilitam a navegação dos usuários finais nesses cenários em que a autenticação de várias partes é necessária.

A Auth0 vem com outro recurso exclusivo – a elogiada equipe de sucesso do cliente. A ajuda pode vir em um bate-papo no Slack ou por e-mail, para que você supere quaisquer obstáculos rapidamente e coloque as aplicações críticas de negócios em produção.

Para obter mais informações, entre em contato com a equipe de vendas da Auth0 ou apenas experimente a plataforma! A capacidade total da plataforma Auth0 é sempre gratuita para uso de desenvolvimento. Crie sua conta gratuita hoje em auth0.com e descubra a diferença focada no desenvolvedor.

Apêndice A: Código de protótipo

Aqui está um exemplo de código que implementa a regra descrita neste caso de uso. Ele obtém um código de autorização por meio do fluxo de consentimento do RoomSMart e, em seguida, troca esse código por um token de atualização. A regra então criptografa esse token de atualização e o salva como metadados da aplicação no perfil do usuário.

function(user, context, callback) {
    // If we already have the user's refresh token, don't ask for consent again.
    user.user_metadata = user.user_metadata || {};
    if (user.app_metadata.encrypted_roomsmart_refresh_token) {
        return callback(null, user, context);
    }

    var CLIENT_ID = '123456';
    var CLIENT_SECRET = 'ABCDEFG';

    // Redirecione para a aplicação da Web RoomSMart para solicitar consentimento.
    if (context.protocol !== 'redirect-callback') {
        var REDIRECT_TO = 'https://roomsmart.com';
        var REDIRECT_PATH = '/oauth2/authorize?client_id=' + CLIENT_ID +
            '&redirect_uri=http://lodgingpicks.auth0.com/continue&response_type=code' +
            '&scope=offline_access%20read_account';

        context.redirect = {
            url: REDIRECT_TO + REDIRECT_PATH
        };

        return callback(null, user, context);
    }
    // Somos redirecionados de volta.
    else {

        // No consent given.
        if (context.request.query.error) {
            return callback(new UnauthorizedError(context.request.query.error_description));
        }

        // Consentimento dado, troque o código de autorização por tokens
        var token_request = {
            body: 'grant_type=authorization_code' +
                '&client_id=' + CLIENT_ID +
                '&client_secret=' + CLIENT_SECRET +
                '&redirect_uri=http://lodgingpicks.auth0.com/continue' +
                '&code=' + context.request.query.code
        };
        request.post('https://roomsmart.com/oauth2/token', token_request, function(err, res, body) {
            if (err) {
                return callback(err);
            }

            var token_response = JSON.parse(body);
            if (!token_response.refresh_token) {
                return callback(new UnauthorizedError('Refresh token is missing'));
            }

            // Criptografe o token de atualização.
            user.app_metadata.encrypted_roomsmart_refresh_token = encrypt(token_response.refresh_token);

            // Armazene-o no perfil do usuário.
            auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
                .then(function() {

                    // Continue the authentication transaction.
                    callback(null, user, context);
                })
                .catch(function(err) {
                    callback(err);
                });
        });
    }

    // Ajudante para criptografar dados confidenciais.
    function encrypt(data) {
        var iv = new Buffer(configuration.ENCRYPT_IV);
        var decodeKey = crypto.createHash('sha256')
            .update(configuration.ENCRYPT_PASSWORD, 'utf-8').digest();
        var cipher = crypto.createCipheriv('aes-256-cbc', decodeKey, iv);
        return cipher.update(JSON.stringify(data || {}), 'utf8', 'base64') + cipher.final('base64');
    }
}

Inscreva-se gratuitamente

Comece a construir e proteja suas aplicações com a plataforma de identidade Auth0 hoje mesmo.

3D login box