Login local e MFA
O login local autentica o usuário com HTTP Basic e estabelece a sessão por cookie. Se o usuário tiver MFA habilitado, a API pede um segundo fator antes de concluir o login.
sequenceDiagram
participant C as Cliente
participant A as Riversoft STCP DirectLink API
C->>A: POST /auth/login (Authorization: Basic)
alt status 0: sem MFA
A-->>C: 200 OK + Set-Cookie __Host-dirl_session
else status 1: PIN por e-mail ou SMS
A-->>C: 206 + linkURL (/auth/mfa)
C->>A: POST linkURL (p=PIN)
A-->>C: 200 OK + Set-Cookie
else status 2: TOTP cadastrado
A-->>C: 206 + linkURL (/auth/mfa)
C->>A: POST linkURL (p=código TOTP)
A-->>C: 200 OK + Set-Cookie
else status 3: cadastro do TOTP
A-->>C: 206 + linkURL (/auth/mfa/register) + secret + qrcode
Note over C: O usuário cadastra a conta no aplicativo autenticador
C->>A: POST linkURL (p=código TOTP)
A-->>C: 200 OK (cadastro concluído, sem sessão)
C->>A: POST /auth/login (novo login)
A-->>C: 206 status 2 (seguir o caminho do TOTP cadastrado)
end
Fazer o login
Envie GET ou POST para /auth/login com as credenciais em HTTP Basic. O endpoint não aceita outro tipo de credencial.
read -r -p 'Usuário: ' API_USER
read -r -s -p 'Senha: ' API_PASSWORD; printf '\n'
curl -i -c cookies.txt \
--user "$API_USER:$API_PASSWORD" \
-X POST \
"$API_BASE/auth/login"A opção -c cookies.txt guarda o cookie de sessão para as chamadas seguintes.
Dica
Quando o administrador habilita a autenticação por um provedor dedicado, informe o usuário no formato PROVEDOR\USUARIO.
Cloudflare Turnstile
Quando o administrador habilita a validação Cloudflare Turnstile, /auth/login, /auth/forget e /auth/firstaccess exigem o token gerado pelo widget Turnstile no header CF-Turnstile-Response. A API valida o token na Cloudflare antes de verificar as credenciais.
read -r -s -p 'Token Turnstile: ' TURNSTILE_TOKEN; printf '\n'
curl -i -c cookies.txt \
--user "$API_USER:$API_PASSWORD" \
-H "CF-Turnstile-Response: $TURNSTILE_TOKEN" \
-X POST \
"$API_BASE/auth/login"O token é de uso único e expira em 300 segundos: gere um novo a cada tentativa. Com a validação desabilitada, o header é ignorado.
| HTTP | Situação |
|---|---|
400 | Header ausente ou com mais de 2048 caracteres. |
403 | Token rejeitado: inválido, expirado ou já utilizado. |
503 | Falha ao consultar a Cloudflare; tente novamente. |
Dica
O widget Turnstile é executado no navegador. Integrações sem interface de usuário devem obter o token Bearer pelo password grant ou token exchange, que não exigem o token Turnstile.
Resposta sem MFA
Quando o login não exige MFA e as verificações de acesso são aprovadas, a API responde 200 e envia o cookie seguro __Host-dirl_session:
HTTP/1.1 200 OK
Set-Cookie: __Host-dirl_session=<token>; Path=/; Secure; HttpOnly; SameSite=Strict
Content-Type: application/json
{
"status": 0,
"description": "<descrição retornada pela API>",
"apiver": "v2 (9.0.1)",
"user": "<usuario>",
"urllink": "<link do portal>",
"time": "<data e hora>"
}O token de sessão é entregue somente no cookie; ele não aparece no JSON. Se a sua integração precisa de um token Bearer, use o password grant.
Concluir o MFA
Se o usuário tiver MFA, o login responde 206 Partial Content. O campo status indica a etapa que o frontend deve apresentar:
status | Situação | O que fazer | linkURL |
|---|---|---|---|
0 | Login concluído, sem MFA (resposta 200). | Seguir com a sessão. | — |
1 | PIN enviado por e-mail ou SMS. | Pedir o PIN recebido. | /auth/mfa |
2 | TOTP já cadastrado. | Pedir o código do aplicativo autenticador. | /auth/mfa |
3 | TOTP ainda não cadastrado. | Exibir o QR code para o cadastro e pedir o primeiro código. | /auth/mfa/register |
O método vem da configuração da instância (AuthMFAMethod: e-mail, SMS ou aplicativo autenticador). O cadastro do usuário pode definir outro método ou desabilitar o MFA só para ele. O MFA vale para o login local com HTTP Basic.
Responder o desafio (status 1 e 2)
{
"status": 2,
"description": "handlerAuthLogin:require MFA",
"apiver": "v2 (9.0.1)",
"user": "<usuario>",
"linkURL": "<link seguro para /auth/mfa>",
"secret": "",
"qrcode": "",
"time": "<data e hora>"
}No status 1, a resposta não tem os campos secret e qrcode, e a API envia o PIN ao e-mail ou ao celular do usuário. No status 2, os dois campos vêm vazios.
Envie o PIN ou o código TOTP no campo de formulário p, para a URL integral recebida em linkURL:
export MFA_URL='<linkURL recebido no login>'
read -r -s -p 'PIN ou código TOTP: ' MFA_CODE; printf '\n'
curl -i -c cookies.txt -X POST \
--data-urlencode "p=$MFA_CODE" \
"$MFA_URL"Com o código válido, a API conclui o login: responde 200 com o mesmo corpo da resposta sem MFA e envia o cookie de sessão.
Cadastrar o TOTP (status 3)
Quando o método é o aplicativo autenticador e o usuário ainda não tem TOTP cadastrado, a API gera um segredo novo e o devolve na resposta 206:
{
"status": 3,
"description": "handlerAuthLogin:require MFA",
"apiver": "v2 (9.0.1)",
"user": "<usuario>",
"linkURL": "<link seguro para /auth/mfa/register>",
"secret": "<segredo TOTP em Base32>",
"qrcode": "<imagem PNG em Base64 URL-safe>",
"time": "<data e hora>"
}| Campo | Uso |
|---|---|
secret | Segredo TOTP, para digitar no aplicativo quando não for possível ler o QR code. |
qrcode | Imagem PNG de 200 × 200 pixels com o QR code do segredo, em Base64 URL-safe (RFC 4648, com - e _). No aplicativo, a conta aparece como STCPDirectLink (<instância>), com o nome do usuário. |
Para exibir o QR code, converta para Base64 padrão antes de montar a URL data::
const b64 = resposta.qrcode.replace(/-/g, '+').replace(/_/g, '/');
imagem.src = `data:image/png;base64,${b64}`;O cadastro segue estes passos:
Exiba o QR code e o segredo e peça ao usuário que cadastre a conta no aplicativo autenticador (Microsoft Authenticator, Google Authenticator ou outro compatível com TOTP).
Peça o código de 6 dígitos gerado pelo aplicativo e envie-o no campo
p, para olinkURLrecebido:export MFA_REGISTER_URL='<linkURL de cadastro TOTP>' read -r -s -p 'Código TOTP: ' MFA_CODE; printf '\n' curl -i -X POST \ --data-urlencode "p=$MFA_CODE" \ "$MFA_REGISTER_URL"Com o código válido, a API grava o segredo e responde
200:{ "status": 0, "description": "handlerAuthMfaRegister:succsessfully", "apiver": "v2 (9.0.1)", "user": "<usuario>", "length": 0, "time": "<data e hora>" }Faça o login de novo em
/auth/login. Agora a resposta é206comstatus2: conclua com o código do aplicativo, como em Responder o desafio.
Importante
O cadastro não estabelece a sessão: a resposta de /auth/mfa/register não tem cookie. O login só termina depois do novo /auth/login e da validação em /auth/mfa.
Erros e validade
| HTTP | Situação |
|---|---|
400 | Link inválido ou expirado, ou campo p ausente. Recomece pelo /auth/login. |
403 | Código TOTP inválido, usuário bloqueado ou não encontrado. |
405 | Método diferente de GET e POST. |
O link vale o tempo definido em secureLinkPinExpireSeconds, e o PIN enviado por e-mail ou SMS tem o tamanho de secureLinkPinMaxLen (veja a configuração do Riversoft STCP DirectLink).
Atenção
Os links de MFA são protegidos e expiram. Não os edite, não os reutilize e não monte os parâmetros manualmente: use sempre a URL integral emitida pela API. O segredo TOTP é um dado sensível: exiba-o somente para o próprio usuário e não o registre em logs.