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:
- Autenticação Segura: Validar credenciais de usuários e criar sessões autenticadas
- Gerenciamento de Sessão: Controlar sessões ativas e realizar logout quando necessário
- Validação de Tokens: Verificar autenticidade e validade de tokens JWT
- Renovação de Tokens: Estender sessões através da renovação de tokens expirados
- 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:
- Recebe a operação: Identifica qual operação de autenticação será executada (login, logout, verify_token, refresh_token, check_permissions)
- Valida parâmetros: Verifica se todos os parâmetros necessários foram fornecidos
- Executa a operação:
- Login: Valida credenciais, gera sessionId e token JWT
- Logout: Invalida a sessão do usuário
- Verify Token: Verifica se o token é válido e não expirou
- Refresh Token: Gera novo token a partir de um token existente
- Check Permissions: Verifica se o usuário possui as permissões solicitadas
- Se válido: Retorna sucesso com os dados da operação
- 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
- Sistema de Login: "Preciso autenticar usuários antes de permitir acesso ao sistema"
- API Segura: "Preciso validar tokens JWT antes de processar requisições"
- Controle de Acesso: "Preciso verificar se o usuário tem permissão para executar determinada ação"
- Renovação de Sessão: "Preciso renovar tokens expirados sem fazer login novamente"
- 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