Nesta página
Antes de começar
- Acesso ao painel Astorya do seu tenant (de preferência o de sandbox).
- Um backend seu capaz de fazer chamadas HTTPS. Os exemplos usam curl, Node.js 18+, Python 3 e PHP 8.
- Um identificador estável para cada membro no seu sistema — o ID do usuário, por exemplo. Ele será o
externalUserId.
1Crie a credencial no painel
- No painel, abra Integrações → Nova credencial.
- Dê um nome que identifique o uso, como “Backend do app — sandbox”.
- Copie o
client_id(no formatoast_live_XXXXXXXXXXXXXXXXXXXXXXXX) e oclient_secret.
O segredo aparece uma única vez. Guarde-o agora em um cofre de segredos ou nas variáveis de ambiente do servidor. Se perder, gere outro com Rotacionar segredo — veja Rotação.
export ASTORYA_CLIENT_ID="ast_live_XXXXXXXXXXXXXXXXXXXXXXXX"
export ASTORYA_CLIENT_SECRET="cole-aqui-o-segredo"2Peça uma sessão pelo seu backend
Quando o membro tocar em “Livros” no seu app, o app chama uma rota do seu backend, que por sua vez chama a Astorya. A credencial nunca sai do servidor.
/partner/v1/sessionscurl -X POST "https://api.astorya.com.br/partner/v1/sessions" \
-u "$ASTORYA_CLIENT_ID:$ASTORYA_CLIENT_SECRET" \
-H "Content-Type: application/json" \
-d '{
"externalUserId": "usuario-10293",
"email": "maria@exemplo.com.br",
"name": "Maria Souza"
}'// Node 18+ (fetch nativo). Rode no SEU servidor, nunca no app.
const ASTORYA_API = 'https://api.astorya.com.br';
const basicAuth = Buffer.from(
`${process.env.ASTORYA_CLIENT_ID}:${process.env.ASTORYA_CLIENT_SECRET}`,
).toString('base64');
export async function createAstoryaSession(member) {
const res = await fetch(`${ASTORYA_API}/partner/v1/sessions`, {
method: 'POST',
headers: {
Authorization: `Basic ${basicAuth}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
externalUserId: String(member.id),
email: member.email,
name: member.name,
}),
});
if (!res.ok) {
const error = await res.json().catch(() => ({}));
throw new Error(`Astorya respondeu ${res.status}: ${error.code ?? res.statusText}`);
}
return res.json(); // { launchUrl, launchToken, expiresAt, user }
}# Python 3 + requests. Rode no SEU servidor, nunca no app.
import os
import requests
ASTORYA_API = "https://api.astorya.com.br"
def create_astorya_session(member: dict) -> dict:
payload = {
"externalUserId": str(member["id"]),
"email": member.get("email"),
"name": member.get("name"),
}
response = requests.post(
f"{ASTORYA_API}/partner/v1/sessions",
auth=(os.environ["ASTORYA_CLIENT_ID"], os.environ["ASTORYA_CLIENT_SECRET"]),
json={k: v for k, v in payload.items() if v is not None},
timeout=10,
)
response.raise_for_status()
return response.json() # launchUrl, launchToken, expiresAt, user<?php
// PHP 8 + ext-curl. Rode no SEU servidor, nunca no app.
function createAstoryaSession(array $member): array
{
$payload = array_filter([
'externalUserId' => (string) $member['id'],
'email' => $member['email'] ?? null,
'name' => $member['name'] ?? null,
], fn ($value) => $value !== null);
$ch = curl_init('https://api.astorya.com.br/partner/v1/sessions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_USERPWD => getenv('ASTORYA_CLIENT_ID') . ':' . getenv('ASTORYA_CLIENT_SECRET'),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($body === false || $status !== 201) {
throw new RuntimeException("Astorya respondeu HTTP $status: $body");
}
return json_decode($body, true); // launchUrl, launchToken, expiresAt, user
}A resposta é 201 Created:
{
"launchUrl": "https://play.astorya.com.br/launch?token=5JxR2mVt9wQ8aLz3nB7cYd4fHk6pE1sU",
"launchToken": "5JxR2mVt9wQ8aLz3nB7cYd4fHk6pE1sU",
"expiresAt": "2026-10-08T14:31:00.000Z",
"user": {
"id": "6702f1c9a8b4e2d3c1f0a9b8",
"externalUserId": "usuario-10293",
"email": "maria@exemplo.com.br",
"name": "Maria Souza",
"status": "ACTIVE"
}
}Na primeira chamada para um externalUserId, a Astorya cria o membro automaticamente. Nas seguintes, reutiliza a mesma conta. Detalhes em Criação no primeiro acesso.
3Abra a launchUrl na WebView
Devolva só a launchUrl para o app e abra-a imediatamente. Para testar agora, sem app, cole a URL no navegador: você verá a Astorya logada como “Maria Souza”.
const { launchUrl } = await api.post('/astorya/session'); // rota do SEU backend
const url = `${launchUrl}&embed=1`;
// <WebView source={{ uri: url }} ... />A launchUrl vale 60 segundos e uma única vez. Não guarde, não reaproveite e não gere com antecedência: peça uma nova a cada abertura da tela.
4Pronto! E agora?
O fluxo básico está funcionando. Para ir para produção:
- Use os exemplos completos de WebView e escute os eventos da ponte (sessão expirada, fechar, abrir link externo).
- Chame
DELETE /users/{externalUserId}quando o membro cancelar o plano. - Agende um job mensal para baixar o relatório de uso.
- Trate os erros e respeite o limite de requisições.