Nesta página
Como o fluxo funciona
Setas cheias são chamadas; tracejadas, respostas. No celular, arraste o diagrama para o lado.
- O membro, já autenticado no seu app, abre a área de livros.
- O app pede ao seu backend uma sessão Astorya. Seu backend identifica o membro pela sessão que você já controla e chama
POST /partner/v1/sessionscom a credencial. - A Astorya cria ou encontra o membro e responde com a
launchUrl. - Seu backend devolve a
launchUrlao app (nunca a credencial). - O app abre a
launchUrlnuma WebView imediatamente. - O Astorya Web lê o token da URL, apaga-o da barra de endereço e troca-o por uma sessão do membro.
- A sessão é criada; o token não serve mais para nada.
- O Astorya Web envia o evento
astorya:readypara o app (veja eventos da ponte) e o membro está dentro.
Criar uma sessão
/partner/v1/sessions| Campo | Descrição |
|---|---|
externalUserIdobrigatóriostring, até 128 | Identificador estável do membro no seu sistema (ID do usuário, matrícula). Não use e-mail nem CPF: e-mails mudam e CPF é dado pessoal desnecessário aqui. |
emailstring | E-mail do membro. Opcional, mas recomendado: identifica a pessoa no suporte e permite vincular uma conta existente (veja E-mail e vínculo). |
namestring | Nome exibido na Astorya (“Olá, Maria”). |
redirectPathstring, começa com / | Tela do Astorya Web para abrir depois do login. Padrão: a tela inicial. Veja Abrir uma tela específica. |
{
"externalUserId": "usuario-10293",
"email": "maria@exemplo.com.br",
"name": "Maria Souza",
"redirectPath": "/biblioteca"
}Resposta 201 Created:
| Campo | Descrição |
|---|---|
launchUrl | URL para abrir na WebView: https://play.astorya.com.br/launch?token=…&redirect=…. |
launchToken | O token que já está dentro da launchUrl. Útil se você monta a URL por conta própria; na maioria dos casos, ignore. |
expiresAt | Quando o link expira (ISO 8601, 60 s após a criação). |
user | { id, externalUserId, email, name, status } — o membro na Astorya. status é ACTIVE ou BLOCKED. |
Criação no primeiro acesso
Você não precisa cadastrar ninguém antes. Na primeira sessão pedida para um externalUserId desconhecido, a Astorya cria o membro na hora (just-in-time provisioning). Nas próximas, encontra a mesma conta — com biblioteca, progresso de leitura e escuta preservados.
- O
externalUserIdé único dentro do seu tenant. Dois parceiros diferentes podem usar o mesmo valor sem conflito. - Membros criados pela integração não têm senha: entram sempre pelo seu app. Não existe tela de login para eles.
- Se você quiser criar ou atualizar o cadastro antes do primeiro acesso (por exemplo, ao contratar o plano), use
PUT /users/{externalUserId}.
E-mail e vínculo de conta
- Sem e-mail: o membro é criado só com o
externalUserId. Funciona normalmente. - E-mail de uma conta que ainda não tem
externalUserIdno seu tenant: a conta existente é vinculada a esseexternalUserId, e o membro mantém o histórico. - E-mail que já pertence a outro membro, vinculado a um
externalUserIddiferente: a API responde 409EMAIL_CONFLICTe nenhuma sessão é criada.
Como tratar EMAIL_CONFLICT: normalmente são dois cadastros seus para a mesma pessoa. Repita a chamada sem o campo email para não bloquear o membro agora, e corrija a duplicidade na sua base.
Abrir uma tela específica
Use redirectPath para levar o membro direto a uma tela. O caminho precisa começar com / (não com //); qualquer valor que não seja uma rota conhecida leva à tela inicial.
| Caminho | Tela |
|---|---|
/ | Início (padrão) |
/explorar | Explorar o catálogo |
/ler | E-books |
/biblioteca | Biblioteca do membro |
/perfil | Conta |
/player/{id} | Player de um audiolivro (id vindo do catálogo) |
/leitor/{id} | Leitor de um e-book (id vindo do catálogo) |
Quando o link expira
A launchUrl vale 60 segundos e só pode ser usada uma vez. Se a WebView abrir um link expirado, já usado ou inválido (por exemplo, o usuário voltou para uma aba antiga, ou o app recarregou a página com a mesma URL):
- O Astorya Web mostra a tela “Link expirado — volte ao app e abra o Astorya de novo”, sem formulário de login.
- Envia o evento
astorya:session-expiredcomreason: "invalid_launch_token". - Seu app deve pedir uma nova sessão ao seu backend e carregar a nova
launchUrlna mesma WebView.
O mesmo evento chega com reason: "refresh_failed" quando uma sessão longa termina durante o uso. O tratamento é idêntico. Se a falha for de rede, o token não é consumido e a tela oferece “Tentar de novo”.
Peça a sessão imediatamente antes de abrir a WebView. Não gere links em lote, não envie por push ou e-mail e não guarde em cache.
Erros desta etapa
| Código | Status | O que fazer |
|---|---|---|
USER_REVOKED | 403 | O acesso do membro foi revogado (DELETE) ou bloqueado. Mostre no app que o benefício não está ativo. Para reativar, use PUT com status: "ACTIVE". |
EMAIL_CONFLICT | 409 | O e-mail já é de outro membro. Repita sem email e corrija a duplicidade na sua base. |
VALIDATION | 400 | externalUserId ausente ou com mais de 128 caracteres, email inválido, redirectPath sem / inicial. |
INVALID_CLIENT | 401 | Credencial errada ou revogada. Veja Autenticação. |
Lista completa em Erros.
Segurança da sua rota de sessão
A rota do seu backend que chama POST /sessions é, na prática, a porta de entrada do membro. Proteja-a como qualquer rota autenticada:
- Obtenha o
externalUserIdda sessão autenticada do seu app, nunca de um parâmetro enviado pelo cliente. Senão, qualquer pessoa poderia entrar como outro membro. - Confira no seu sistema se o membro tem direito ao benefício antes de pedir a sessão.
- Devolva ao app só a
launchUrl, e use HTTPS de ponta a ponta.