Pular para conteúdo

AUTH - Autenticação e Gerenciamento de Sessão

O que é este Node?

O AUTH é o node responsável por gerenciar autenticação de usuários e sessões no Lumina Flow Builder. Ele permite realizar login, logout, verificação de tokens, renovação de tokens e verificação de permissões.

Por que este Node existe?

Sistemas modernos precisam de mecanismos robustos de autenticação e controle de acesso. O AUTH existe para:

  1. Autenticação Segura: Validar credenciais de usuários e criar sessões autenticadas
  2. Gerenciamento de Sessão: Controlar sessões ativas e realizar logout quando necessário
  3. Validação de Tokens: Verificar autenticidade e validade de tokens JWT
  4. Renovação de Tokens: Estender sessões através da renovação de tokens expirados
  5. Controle de Permissões: Verificar se usuários possuem permissões necessárias para realizar ações

Como funciona internamente?

Quando o AUTH é executado, o sistema:

  1. Recebe a operação: Identifica qual operação de autenticação será executada (login, logout, verify_token, refresh_token, check_permissions)
  2. Valida parâmetros: Verifica se todos os parâmetros necessários foram fornecidos
  3. Executa a operação:
  4. Login: Valida credenciais, gera sessionId e token JWT
  5. Logout: Invalida a sessão do usuário
  6. Verify Token: Verifica se o token é válido e não expirou
  7. Refresh Token: Gera novo token a partir de um token existente
  8. Check Permissions: Verifica se o usuário possui as permissões solicitadas
  9. Se válido: Retorna sucesso com os dados da operação
  10. Se inválido/erro: Retorna erro com mensagem descritiva

Código interno (security-executor.service.ts:53-77):

private async executeAuth(parameters: any, context: any): Promise<any> {
  const { operation, username, password, token, sessionId, permissions } = parameters;

  this.logger.log(`🔐 AUTH - Operation: ${operation}`);

  switch (operation) {
    case 'login':
      return this.authenticateUser(username, password, context);

    case 'logout':
      return this.logoutUser(sessionId, context);

    case 'verify_token':
      return this.verifyToken(token, context);

    case 'refresh_token':
      return this.refreshToken(token, context);

    case 'check_permissions':
      return this.checkPermissions(username, permissions, context);

    default:
      throw new Error(`Unsupported auth operation: ${operation}`);
  }
}

Quando você DEVE usar este Node?

Use AUTH sempre que precisar de autenticação, gerenciamento de sessão ou controle de acesso:

Casos de uso

  1. Sistema de Login: "Preciso autenticar usuários antes de permitir acesso ao sistema"
  2. API Segura: "Preciso validar tokens JWT antes de processar requisições"
  3. Controle de Acesso: "Preciso verificar se o usuário tem permissão para executar determinada ação"
  4. Renovação de Sessão: "Preciso renovar tokens expirados sem fazer login novamente"
  5. Logout Seguro: "Preciso invalidar sessões quando usuário faz logout"

Quando NÃO usar AUTH

  • Criptografia de Dados: Use ENCRYPT ao invés de AUTH
  • Autenticação de Dois Fatores: Use 2FA ao invés de AUTH
  • OAuth Social Login: Use OAUTH ao invés de AUTH

Parâmetros Detalhados

operation (string, obrigatório)

O que é: Define qual operação de autenticação será executada.

Valores possíveis: - login: Autentica usuário com username e password - logout: Encerra sessão do usuário - verify_token: Verifica validade de um token JWT - refresh_token: Renova um token JWT - check_permissions: Verifica permissões do usuário

Flow completo para testar (Login):

{
  "name": "Teste AUTH - Login",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Login Usuário",
        "parameters": {
          "operation": "login",
          "username": "jose.roberto",
          "password": "senha123"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Login",
        "parameters": {
          "message": "Login realizado! Token: {{auth_1.token}}, Sessão: {{auth_1.sessionId}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Importe o flow e execute. O sistema deve retornar um token JWT e um sessionId válidos.

username (string, obrigatório para login)

O que é: Nome de usuário para autenticação.

Flow completo para testar:

{
  "name": "Teste AUTH - Username",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Digite Username",
        "parameters": {
          "message": "Digite seu nome de usuário:",
          "variableName": "username"
        }
      }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Fazer Login",
        "parameters": {
          "operation": "login",
          "username": "{{username}}",
          "password": "senha123"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Bem-vindo, {{username}}!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite um username qualquer. O sistema deve autenticar e retornar token.

password (string, obrigatório para login)

O que é: Senha do usuário para autenticação. Deve ter no mínimo 6 caracteres.

Flow completo para testar:

{
  "name": "Teste AUTH - Password",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Digite Senha",
        "parameters": {
          "message": "Digite sua senha (mínimo 6 caracteres):",
          "variableName": "password"
        }
      }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Autenticar",
        "parameters": {
          "operation": "login",
          "username": "usuario",
          "password": "{{password}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Autenticação realizada com sucesso!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite uma senha com pelo menos 6 caracteres. O sistema deve autenticar com sucesso.

token (string, obrigatório para verify_token e refresh_token)

O que é: Token JWT para verificação ou renovação.

Flow completo para testar:

{
  "name": "Teste AUTH - Verify Token",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Fazer Login",
        "parameters": {
          "operation": "login",
          "username": "usuario",
          "password": "senha123"
        }
      }
    },
    {
      "id": "auth_2",
      "type": "auth",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Verificar Token",
        "parameters": {
          "operation": "verify_token",
          "token": "{{auth_1.token}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Status",
        "parameters": {
          "message": "Token válido: {{auth_2.valid}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "auth_1" },
    { "source": "auth_1", "target": "auth_2" },
    { "source": "auth_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: O flow faz login, depois verifica o token gerado. Deve retornar valid: true.

sessionId (string, obrigatório para logout)

O que é: Identificador único da sessão do usuário.

Flow completo para testar:

{
  "name": "Teste AUTH - Logout",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Fazer Login",
        "parameters": {
          "operation": "login",
          "username": "usuario",
          "password": "senha123"
        }
      }
    },
    {
      "id": "auth_2",
      "type": "auth",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Fazer Logout",
        "parameters": {
          "operation": "logout",
          "sessionId": "{{auth_1.sessionId}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "Logout realizado. Sessão {{auth_2.sessionId}} encerrada."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "auth_1" },
    { "source": "auth_1", "target": "auth_2" },
    { "source": "auth_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: O flow faz login e depois logout. Deve confirmar encerramento da sessão.

permissions (array, obrigatório para check_permissions)

O que é: Lista de permissões a serem verificadas para o usuário.

Valores comuns: ['read', 'write', 'delete', 'manage_users']

Flow completo para testar:

{
  "name": "Teste AUTH - Check Permissions",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Verificar Permissões",
        "parameters": {
          "operation": "check_permissions",
          "username": "usuario",
          "permissions": ["read", "write"]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Tem todas as permissões: {{auth_1.hasAllPermissions}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Verifica se o usuário tem permissões 'read' e 'write'. Deve retornar true ou false.

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Tipo de operação: login, logout, verify_token, refresh_token, check_permissions
username string Condicional Necessário para login e check_permissions
password string Condicional Necessário para login (mínimo 6 caracteres)
token string Condicional Necessário para verify_token e refresh_token
sessionId string Condicional Necessário para logout
permissions array Condicional Necessário para check_permissions

Exemplo 1: Sistema Completo de Login e Logout

Objetivo: Demonstrar fluxo completo de autenticação com login e logout

JSON para Importar

{
  "name": "Sistema de Login Completo",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Username",
        "parameters": {
          "message": "Digite seu nome de usuário:",
          "variableName": "username"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Password",
        "parameters": {
          "message": "Digite sua senha:",
          "variableName": "password"
        }
      }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Login",
        "parameters": {
          "operation": "login",
          "username": "{{username}}",
          "password": "{{password}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Boas-vindas",
        "parameters": {
          "message": "Bem-vindo, {{username}}! Token: {{auth_1.token}}"
        }
      }
    },
    {
      "id": "input_3",
      "type": "input",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Menu",
        "parameters": {
          "message": "Digite 'sair' para fazer logout:",
          "variableName": "acao"
        }
      }
    },
    {
      "id": "auth_2",
      "type": "auth",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Logout",
        "parameters": {
          "operation": "logout",
          "sessionId": "{{auth_1.sessionId}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "Despedida",
        "parameters": {
          "message": "Logout realizado. Até logo!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "input_2" },
    { "source": "input_2", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "input_3" },
    { "source": "input_3", "target": "auth_2" },
    { "source": "auth_2", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite seu nome de usuário:
Usuário: jose.roberto
Sistema: Digite sua senha:
Usuário: senha123
Sistema: Bem-vindo, jose.roberto! Token: eyJhbGc...
Sistema: Digite 'sair' para fazer logout:
Usuário: sair
Sistema: Logout realizado. Até logo!

Exemplo 2: Verificação de Token e Renovação

Objetivo: Demonstrar verificação e renovação de tokens JWT

JSON para Importar

{
  "name": "Verificação e Renovação de Token",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Login",
        "parameters": {
          "operation": "login",
          "username": "usuario",
          "password": "senha123"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Token Gerado",
        "parameters": {
          "message": "Token gerado: {{auth_1.token}}"
        }
      }
    },
    {
      "id": "auth_2",
      "type": "auth",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Verificar Token",
        "parameters": {
          "operation": "verify_token",
          "token": "{{auth_1.token}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Status Token",
        "parameters": {
          "message": "Token válido: {{auth_2.valid}}"
        }
      }
    },
    {
      "id": "auth_3",
      "type": "auth",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Renovar Token",
        "parameters": {
          "operation": "refresh_token",
          "token": "{{auth_1.token}}"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Novo Token",
        "parameters": {
          "message": "Token renovado: {{auth_3.newToken}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "auth_1" },
    { "source": "auth_1", "target": "message_1" },
    { "source": "message_1", "target": "auth_2" },
    { "source": "auth_2", "target": "message_2" },
    { "source": "message_2", "target": "auth_3" },
    { "source": "auth_3", "target": "message_3" },
    { "source": "message_3", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Token gerado: eyJhbGc...
Sistema: Token válido: true
Sistema: Token renovado: eyJhbGc...

Exemplo 3: Controle de Acesso com Permissões

Objetivo: Demonstrar verificação de permissões antes de executar ações

JSON para Importar

{
  "name": "Controle de Acesso com Permissões",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Username",
        "parameters": {
          "message": "Digite seu username:",
          "variableName": "username"
        }
      }
    },
    {
      "id": "auth_1",
      "type": "auth",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Verificar Permissões",
        "parameters": {
          "operation": "check_permissions",
          "username": "{{username}}",
          "permissions": ["read", "write", "delete"]
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Tem Permissão?",
        "parameters": {
          "condition": "{{auth_1.hasAllPermissions}} == true"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Acesso Permitido",
        "parameters": {
          "message": "Acesso concedido! Você tem todas as permissões necessárias."
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Acesso Negado",
        "parameters": {
          "message": "Acesso negado! Permissões insuficientes."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "auth_1" },
    { "source": "auth_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_1", "label": "true" },
    { "source": "condition_1", "target": "message_2", "label": "false" },
    { "source": "message_1", "target": "end_1" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite seu username:
Usuário: admin
Sistema: Acesso concedido! Você tem todas as permissões necessárias.

Resposta do Node

Login bem-sucedido:

{
  "success": true,
  "action": "user_authenticated",
  "username": "jose.roberto",
  "sessionId": "a1b2c3d4e5f6...",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expiresAt": "2025-01-15T11:30:00.000Z",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Verificação de token:

{
  "success": true,
  "action": "token_verified",
  "valid": true,
  "payload": {
    "username": "jose.roberto",
    "sessionId": "a1b2c3d4e5f6...",
    "iat": 1705317000,
    "exp": 1705320600
  },
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Verificação de permissões:

{
  "success": true,
  "action": "permissions_checked",
  "username": "jose.roberto",
  "requestedPermissions": ["read", "write", "delete"],
  "userPermissions": ["read", "write"],
  "hasAllPermissions": false,
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Boas Práticas

SIM:

  • Sempre valide credenciais antes de gerar tokens
  • Use tokens JWT com tempo de expiração apropriado (1h é recomendado)
  • Verifique permissões antes de executar ações sensíveis
  • Implemente renovação de tokens para evitar login frequente
  • Armazene secrets JWT em variáveis de ambiente
  • Use logout para invalidar sessões quando o usuário sair

NÃO:

  • Não armazene senhas em plain text
  • Não use tokens sem expiração
  • Não confie em tokens sem verificação
  • Não ignore verificação de permissões
  • Não exponha secrets JWT no código
  • Não permita operações sem autenticação prévia

Dicas

💡 Dica 1: Use o AUTH em conjunto com CONDITION para criar fluxos condicionais baseados em autenticação e permissões

💡 Dica 2: Combine AUTH com VARIABLE para armazenar tokens e sessionIds para uso posterior no flow

💡 Dica 3: Configure JWT_SECRET nas variáveis de ambiente para garantir segurança dos tokens em produção

💡 Dica 4: Implemente renovação automática de tokens antes da expiração para melhor experiência do usuário

💡 Dica 5: Use check_permissions para implementar RBAC (Role-Based Access Control) nos seus flows

Próximo Node

ENCRYPT - Criptografia de dados sensíveis → TOKEN - Gerenciamento avançado de tokens JWT → 2FA - Autenticação de dois fatores