> ## Documentation Index
> Fetch the complete documentation index at: https://ajuda.memberkit.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Login a partir do seu sistema

> Leve o aluno do seu sistema, site ou aplicativo para a área de membros sem pedir a senha, com um token gerado no seu servidor.

Se o aluno já está logado no seu sistema, num site em WordPress ou no seu aplicativo, ele não precisa entrar de novo na área de membros. O seu servidor gera um token de login para ele na [API de operador](https://ajuda.memberkit.com.br/referencia-api/introducao.md) e o manda para o seu site, que troca esse token por uma sessão de aluno. É o mesmo mecanismo dos links nos [e-mails da MemberKit](https://ajuda.memberkit.com.br/headless/emails-para-seu-frontend.md).

## Como funciona

**1. O seu servidor gera o token**

Com a chave da API de operador, que fica só no servidor, peça um token para o e-mail do aluno:

```bash theme={null}
curl -X POST "https://memberkit.com.br/api/v1/tokens?api_key=$MEMBERKIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "aluno@exemplo.com"}'
```

```json theme={null}
{ "token": "eyJfcmFpbHMiOnsiZGF0YSI6MTIzLCJwdXIiOiJ1c2VyL2F1dGhfdG9rZW4ifX0--...", "authenticated_url": "https://minhaescola.memberkit.com.br/?token=..." }
```

Use só o `token`. O `authenticated_url` abre a área de membros hospedada, não o seu site.

**2. O seu servidor redireciona o aluno**

Envie o navegador para a rota `/sso` do seu site com o token:

```
https://aulas.suamarca.com.br/sso?token=<token>
```

**3. O seu site troca o token por uma sessão**

A rota `/sso` lê o token do endereço e o troca por um token de aluno em `POST /auth/exchange`, informando a área de membros. Com o [template](https://ajuda.memberkit.com.br/headless/comece-com-um-agente.md), essa rota já existe. Veja [A rota /sso](#a-rota-sso) para o seu próprio stack.

## Exemplos no servidor

Uma rota do seu sistema que o aluno abre quando quer ir para a área de membros. Nos três exemplos, o aluno já está logado no seu sistema, a chave da API está na variável de ambiente `MEMBERKIT_API_KEY` e o site está em `aulas.suamarca.com.br`.

```js Node.js theme={null}
app.get("/area-de-membros", async (req, res) => {
  const response = await fetch(`https://memberkit.com.br/api/v1/tokens?api_key=${process.env.MEMBERKIT_API_KEY}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ email: req.user.email })
  });
  if (response.status === 404) return res.redirect("/sem-acesso");

  const { token } = await response.json();
  res.redirect(`https://aulas.suamarca.com.br/sso?token=${encodeURIComponent(token)}`);
});
```

```php PHP theme={null}
$request = curl_init("https://memberkit.com.br/api/v1/tokens?api_key=" . getenv("MEMBERKIT_API_KEY"));
curl_setopt_array($request, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
  CURLOPT_POSTFIELDS => json_encode(["email" => $_SESSION["email"]]),
  CURLOPT_RETURNTRANSFER => true,
]);
$body = curl_exec($request);

if (curl_getinfo($request, CURLINFO_RESPONSE_CODE) === 404) {
  header("Location: /sem-acesso");
  exit;
}

$token = json_decode($body, true)["token"];
header("Location: https://aulas.suamarca.com.br/sso?token=" . urlencode($token));
exit;
```

```ruby Ruby on Rails theme={null}
class MemberAreaController < ApplicationController
  def show
    response = Net::HTTP.post(
      URI("https://memberkit.com.br/api/v1/tokens?api_key=#{ENV.fetch("MEMBERKIT_API_KEY")}"),
      { email: current_user.email }.to_json,
      "Content-Type" => "application/json"
    )
    return redirect_to "/sem-acesso" if response.code == "404"

    token = JSON.parse(response.body).fetch("token")
    redirect_to "https://aulas.suamarca.com.br/sso?token=#{CGI.escape(token)}", allow_other_host: true
  end
end
```

A API de operador responde `404` quando o e-mail não é de um aluno da área de membros, quando o aluno está bloqueado e para contas de dono e colaborador. Trate esse caso como "sem acesso", não como erro.

## Garanta que o aluno existe

O token só sai para quem já é aluno. Se o seu sistema é quem libera o acesso, cadastre o aluno antes de gerar o token, com [`POST /api/v1/users`](https://ajuda.memberkit.com.br/referencia-api/post-users). A chamada cria ou atualiza pelo e-mail, então pode ser feita a cada login sem duplicar ninguém:

```bash theme={null}
curl -X POST "https://memberkit.com.br/api/v1/users?api_key=$MEMBERKIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"full_name": "Ana Souza", "email": "aluno@exemplo.com", "status": "active", "classroom_ids": [12]}'
```

Se o acesso já é liberado por uma [plataforma de pagamento](https://ajuda.memberkit.com.br/integracoes/introducao.md) ou por outra integração, pule esta etapa: o aluno já existe quando chega ao seu sistema.

## A rota /sso

No seu próprio stack, crie uma rota que leia o token do endereço, faça a troca e guarde o token de aluno como o login comum guardaria. O código roda no navegador e não precisa de segredo nenhum; a [chave headless](https://ajuda.memberkit.com.br/headless/referencia/introducao.md#autenticação) é pública:

```js theme={null}
const token = new URLSearchParams(location.search).get("token");

const response = await fetch("https://memberkit.com.br/api/headless/v1/auth/exchange", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Memberkit-Headless-Key": "sua-chave-headless"
  },
  body: JSON.stringify({ token })
});

if (response.ok) {
  const { access_token } = await response.json();
  // guarde o access_token e leve o aluno para a página inicial
} else {
  const { code, message } = await response.json();
  // leve o aluno para o login mostrando a message
}
```

A troca responde `invalid_token` quando o token expirou ou não é desta área de membros e `account_locked` quando o aluno foi bloqueado. Nos dois casos, mostre a mensagem na tela de login.

## Regras

* **A chave da API de operador nunca vai para o site.** Ela controla a área de membros inteira. Só o token de login, que vale para um aluno e por 24 horas, chega ao navegador.
* **O token vale por 24 horas e pode ser trocado mais de uma vez** nesse período. Cada troca é um login novo: como cada aluno tem [uma sessão por vez](https://ajuda.memberkit.com.br/headless/referencia/introducao.md#autenticação), ela encerra a sessão anterior dele, em outro dispositivo ou na área de membros hospedada.
* **Gere o token na hora do clique**, não antes. Um token guardado numa página ou num e-mail seu expira sem aviso e leva o aluno para a tela de login.
* **Os e-mails da MemberKit usam o mesmo token.** Ao apontar os templates para o seu site, os links deles passam pela mesma rota `/sso`. Veja [E-mails para o seu site](https://ajuda.memberkit.com.br/headless/emails-para-seu-frontend.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.