Login por um flow
O Waiso não guarda senhas dos visitantes do seu app. Um flow de login que você escreve confere o que o visitante digitou — numa tabela, numa lista, num código de convite — e responde {"user": {...}} para deixar entrar.
- Marcar um flow como login de um app
- Fazer o visitante entrar pela página
- Fazer um endpoint responder só a visitantes que entraram e receber quem eles são
Como funciona
Três peças se encontram: o app (uma página com formulário de entrada), o flow de login (suas regras de quem entra) e os endpoints que a página chama depois de entrar. A página envia o que o visitante digitou para o login do app; o Waiso roda o seu flow; quando o flow responde um user, o Waiso entrega à página uma sessão que dura o que as configurações do app dizem. Daí em diante toda chamada a leva, e endpoints em Usuários do app só aceitam chamadas que a tragam.
O user que o seu flow devolve tem o formato que você quiser — um id, um nome, um papel, a conta de cliente a que o visitante pertence. O que ele contém é exatamente o que cada endpoint de Usuários do app recebe, então um script pode filtrar uma tabela por user["id"] sem nunca confiar no que a página envia.
Configure
- Escreva o flow de login
Um flow cuja última etapa responde
{"user": {...}}para deixar entrar, ou qualquer outra coisa (umamessageé mostrada) para recusar. Publique. - Escolha no app
App → Configurações → Login: escolha o flow e quanto tempo dura uma sessão (7 dias por padrão).
- Proteja os endpoints
Na página de API, defina o acesso de cada endpoint privado como Usuários do app.
def main(email: str = "", code: str = ""):
# Decide who gets in: a table, a list, an invite code — your rules.
guests = {"ana@exemplo.com": "1234"}
if guests.get(email.strip().lower()) == code:
return {"user": {"email": email, "name": email.split("@")[0]}}
return {"message": "Wrong e-mail or code"}Pela página
<script src="/_waiso.js"></script>
<script>
async function signIn(email, code) {
try {
const user = await waiso.login({ email, code }) // runs the login flow
show(`Hello, ${user.name}`)
} catch (e) {
show(e.body?.message || 'Could not sign in')
}
}
// Every call now carries the session; "App users" endpoints receive `user`.
const mine = await waiso.call('my-orders', {})
</script>A sessão fica guardada só na aba aberta e vai num cabeçalho em cada chamada — nunca num cookie — então funciona igual numa cópia baixada. waiso.logout() encerra; Desconectar todos em Configurações encerra todas.
O que um endpoint de Usuários do app recebe
def main(user: dict):
# Only signed-in visitors reach this; user is what the login flow returned.
return {"orders": find_orders(user["email"])}- Um flow recebe
usercomo entrada; um script quando declara um parâmetrouser. - Sem sessão, com uma expirada, ou com uma de um app de outro projeto: recusada com
401antes de qualquer execução. - Tentativas de login são freadas depois de 10 por minuto por visitante.
Em Execuções
As execuções do flow de login são suas, como qualquer execução — o que o visitante digitou fica nas entradas, então confira códigos em vez de guardar senhas de verdade nele.
Uma sessão pertence a um app e a um projeto: uma sessão de um app de outro projeto é recusada em tudo aqui, e desconectar todos de um app nunca mexe em outro. Quando um app é tirado do ar, as sessões dele param de funcionar na hora.
Mantenha a sessão curta em páginas sensíveis: uma hora basta para um formulário interno, uma semana serve para uma lista de convidados.