Por que usar Secret (e não hardcode)
Tokens, senhas de API e outras credenciais não devem ir no código da função.
Se o valor ficar escrito no index.js:
- Qualquer um que abra a função na tela vê o segredo.
- Print de tela, log de
console.loge cópia do script vazam o token. - Trocar a chave obriga a editar e republicar o código — e o valor antigo continua no histórico da função.
- O mesmo script não serve para rotacionar credencial sem risco de esquecer um lugar.
O cadastro Funções → Configurações → Secrets guarda o valor criptografado. A função só conhece o nome do secret (ex.: api-parceiro-token) e lê o valor em tempo de execução com keyManager. Assim você:
- Rotaciona a chave só no cadastro do Secret, sem mexer no script.
- Evita vazar o valor em prints do código.
- Usa o mesmo padrão em qualquer função do sistema (integração com API de terceiro, token de parceiro, senha de comparação, etc.).
- Separa “o que a função faz” de “qual credencial está valendo agora”.
Use Secret para: chave de API de parceiro, token de autenticação, senha que o script precisa comparar ou enviar.
Não use Secret para: textos de negócio, UUID de kanban/etapa/usuário que não são credencial (esses podem ficar no código ou em configuração visível).
Permissão necessária
Para criar, editar ou ver Secrets na interface, o usuário precisa de permissão de escrita na tabela de Secrets (puca_functions_api_secret).
Sem essa permissão:
- o menu Funções → Configurações → Secrets pode não aparecer; ou
- a tela abre, mas você não consegue cadastrar nem alterar registros.
Se você não vê o menu Secrets (ou não consegue salvar), peça ao administrador do ambiente para conceder escrita em puca_functions_api_secret ao seu usuário. Leitura sozinha não basta para cadastrar ou rotacionar o valor.
1. Cadastrar um Secret na UI
- Abra o módulo Funções.
- No menu, Configurações → Secrets.
- Clique para criar um registro.
- Preencha:
- Nome: identificador estável que o código vai usar. Ex.:
api-parceiro-token. Sem espaços; não coloque o valor da chave no nome. - Valor: o segredo em si (o token, a senha ou a chave). Não misture prefixos de protocolo no valor, a menos que a API de destino realmente exija o texto completo.
- Nome: identificador estável que o código vai usar. Ex.:
- Salve.
Na listagem aparece o nome. O valor fica protegido (não trate essa tela como bloco de notas público: só quem tem permissão de Secrets deve acessá-la).
Para trocar a chave depois: abra o mesmo Secret, atualize Valor, salve. A próxima execução da função já lê o valor novo. Não é preciso alterar o código.
2. Usar o Secret em qualquer função
keyManager está disponível no código da função (engine functions-node-v3). O argumento é o Nome cadastrado, não o valor:
module.exports = async (req, comunicationService) => {
const secretRaw = await keyManager('api-parceiro-token');
const secret = typeof secretRaw === 'string'
? secretRaw
: (secretRaw && (secretRaw.value || secretRaw.secret || secretRaw.token));
if (!secret) {
throw new Error('Secret api-parceiro-token nao encontrado ou vazio');
}
// use `secret` na chamada HTTP, comparação, etc. — nunca em console.log
};
Regras práticas:
- O argumento de
keyManageré o Nome do cadastro, não o valor. - Não faça
console.logdo secret nem de cabeçalhos/corpos que o contenham. - Se o nome não existir, a leitura falha (
Get secret failednos logs de depuração). Confira o nome digitado.
O log de depuração pode mostrar que a função pediu um secret pelo nome. Isso é esperado. O valor não deve aparecer no log.
O mesmo cadastro pode ser lido por várias funções. O que muda de um caso para outro é como o script usa o valor (enviar para uma API, comparar uma senha, montar um header, etc.) — não a forma de cadastrar o Secret.
Resumo
| Faça | Evite |
|---|---|
| Guardar credencial em Secrets | Colar token no index.js |
Pedir escrita em puca_functions_api_secret se o menu não aparecer |
Assumir que todo usuário vê Secrets |
await keyManager('nome-do-secret') |
const token = 'abc123...' |
| Rotacionar só o Valor do Secret | Reescrever a função a cada troca de chave |
| Logar só o nome do secret, se precisar | console.log do valor |