Astorya Developers
Integração no app

Login único (SSO)

O membro já está logado no seu app. Seu backend troca essa identidade por um link de acesso de uso único, e a Astorya abre com a conta certa — criada na hora, se for o primeiro acesso.

Nesta página
  1. Como o fluxo funciona
  2. Criar uma sessão
  3. Criação no primeiro acesso
  4. E-mail e vínculo de conta
  5. Abrir uma tela específica
  6. Quando o link expira
  7. Erros desta etapa
  8. Segurança da sua rota de sessão

Como o fluxo funciona

Diagrama de sequência do login único O app do parceiro pede ao backend do parceiro uma sessão; o backend chama POST /partner/v1/sessions na API Astorya e recebe a launchUrl, válida por 60 segundos e de uso único; o app abre a launchUrl na WebView; o Astorya Web troca o token por uma sessão e avisa o app com o evento astorya:ready. SEU LADO ASTORYA App do parceiro membro já logado Backend do parceiro guarda o client_secret API Astorya /partner/v1 Astorya Web dentro da WebView launchUrl vale 60 s e uma única vez 1. Membro toca em “Livros” 2. POST /partner/v1/sessions Authorization: Basic … 3. 201 { launchUrl, user } 4. Devolve só a launchUrl 5. Abre a launchUrl na WebView 6. Troca o token 7. Sessão do membro 8. Evento astorya:ready — membro logado

Setas cheias são chamadas; tracejadas, respostas. No celular, arraste o diagrama para o lado.

  1. O membro, já autenticado no seu app, abre a área de livros.
  2. 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/sessions com a credencial.
  3. A Astorya cria ou encontra o membro e responde com a launchUrl.
  4. Seu backend devolve a launchUrl ao app (nunca a credencial).
  5. O app abre a launchUrl numa WebView imediatamente.
  6. O Astorya Web lê o token da URL, apaga-o da barra de endereço e troca-o por uma sessão do membro.
  7. A sessão é criada; o token não serve mais para nada.
  8. O Astorya Web envia o evento astorya:ready para o app (veja eventos da ponte) e o membro está dentro.

Criar uma sessão

POST/partner/v1/sessions
CampoDescrição
externalUserIdobrigatóriostring, até 128Identificador 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.
emailstringE-mail do membro. Opcional, mas recomendado: identifica a pessoa no suporte e permite vincular uma conta existente (veja E-mail e vínculo).
namestringNome 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.
Corpo da requisição
{
  "externalUserId": "usuario-10293",
  "email": "maria@exemplo.com.br",
  "name": "Maria Souza",
  "redirectPath": "/biblioteca"
}

Resposta 201 Created:

CampoDescrição
launchUrlURL para abrir na WebView: https://play.astorya.com.br/launch?token=…&redirect=….
launchTokenO token que já está dentro da launchUrl. Útil se você monta a URL por conta própria; na maioria dos casos, ignore.
expiresAtQuando 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 externalUserId no seu tenant: a conta existente é vinculada a esse externalUserId, e o membro mantém o histórico.
  • E-mail que já pertence a outro membro, vinculado a um externalUserId diferente: a API responde 409 EMAIL_CONFLICT e 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.

CaminhoTela
/Início (padrão)
/explorarExplorar o catálogo
/lerE-books
/bibliotecaBiblioteca do membro
/perfilConta
/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):

  1. O Astorya Web mostra a tela “Link expirado — volte ao app e abra o Astorya de novo”, sem formulário de login.
  2. Envia o evento astorya:session-expired com reason: "invalid_launch_token".
  3. Seu app deve pedir uma nova sessão ao seu backend e carregar a nova launchUrl na 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ódigoStatusO que fazer
USER_REVOKED403O 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_CONFLICT409O e-mail já é de outro membro. Repita sem email e corrija a duplicidade na sua base.
VALIDATION400externalUserId ausente ou com mais de 128 caracteres, email inválido, redirectPath sem / inicial.
INVALID_CLIENT401Credencial 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 externalUserId da 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.