Login local e 2FA
O login autentica o operador com um formulário OAuth 2.0 (password grant) e devolve um token Bearer. Quando a autenticação de dois fatores (2FA) está habilitada, a API pede um código TOTP antes de entregar o token.
sequenceDiagram
participant C as Cliente
participant A as Riversoft STCP Gemini API
C->>A: POST /oauth/v2/token (grant_type, username, password)
alt 2FA desabilitada
A-->>C: 200 OK + access_token
else 2FA habilitada, TOTP cadastrado
A-->>C: 200 OK + URL do desafio
C->>A: POST URL do desafio (Code)
A-->>C: 200 OK + access_token
else 2FA habilitada, primeiro acesso
A-->>C: 200 OK + URL do desafio + secret + qrcode
Note over C: O operador cadastra a conta no aplicativo autenticador
C->>A: POST URL do desafio (Code)
A-->>C: 200 OK + access_token
end
Fazer o login
Envie as credenciais do operador em um formulário application/x-www-form-urlencoded:
read -r -p 'Operador: ' API_USER
read -r -s -p 'Senha: ' API_PASSWORD; printf '\n'
curl -s \
--data-urlencode 'grant_type=password' \
--data-urlencode "username=$API_USER" \
--data-urlencode "password=$API_PASSWORD" \
"$API_BASE/oauth/v2/token"O header Content-Type deve ser exatamente application/x-www-form-urlencoded, sem charset. Com outro valor, a API responde 415.
Login com LDAP
Para entrar com uma conta do diretório corporativo, informe o usuário no formato <provedor>/<operador>. O <provedor> é o nome do provedor LDAP cadastrado no cadastro da API (ssoProviders):
curl -s \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=diretorio-corporativo/jsilva' \
--data-urlencode "password=$API_PASSWORD" \
"$API_BASE/oauth/v2/token"O operador precisa existir na Riversoft STCP Gemini API com o mesmo nome. O LDAP só é aceito em /oauth/v2/token.
Resposta sem 2FA
Quando a 2FA está desabilitada, a API responde 200 com o token:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"scope": "{\"stcpcore\":{\"instance\":15,\"user\":15,...}}",
"operator": "stcpadmin",
"rest_name": "RestAPI",
"token_type": "Bearer"
}| Campo | Descrição |
|---|---|
access_token | Token usado nas chamadas seguintes. |
scope | Permissões do operador sobre cada grupo de recursos (JSON serializado em texto). |
operator | Operador autenticado. |
rest_name | Nome do cadastro da API (rest_name do config.json). |
token_type | Sempre Bearer. |
Veja como usar o token em Sessão e logout.
Concluir a 2FA
A 2FA é habilitada no cadastro da API (API/Supervisão), no campo enable2FA, ou pela variável de ambiente DIRLMFA (veja os parâmetros da API). Com ela habilitada, o login responde 200 com o caminho do desafio, em vez do token. A resposta não tem campo status: o que indica a etapa são os campos presentes.
| Campos na resposta | Situação | O que fazer |
|---|---|---|
access_token | 2FA desabilitada. | Seguir com o token. |
URL | TOTP já cadastrado. | Pedir o código do aplicativo autenticador. |
URL, secret e qrcode | Primeiro acesso: TOTP ainda não cadastrado. | Exibir o QR code para o cadastro e pedir o primeiro código. |
Responder o desafio
{
"URL": "/oauth/v2/token/mfa/01936b2e-7c4a-7d1e-9f3a-2b5c8d9e0f12"
}Envie o código TOTP de 6 dígitos em JSON, para o caminho recebido em URL:
export MFA_PATH='<URL recebida no login>'
read -r -s -p 'Código TOTP: ' MFA_CODE; printf '\n'
curl -s -X POST \
-H 'Content-Type: application/json' \
-d "{\"Code\": \"$MFA_CODE\"}" \
"$API_BASE$MFA_PATH"Com o código válido, a API responde 200 com o token, no mesmo formato da resposta sem 2FA. O campo Operator do corpo é opcional: a API usa o operador do desafio.
Cadastrar o TOTP (primeiro acesso)
No primeiro login com a 2FA habilitada, a API gera um segredo TOTP para o operador e o devolve junto com o caminho do desafio:
{
"URL": "/oauth/v2/token/mfa/01936b2e-7c4a-7d1e-9f3a-2b5c8d9e0f12",
"secret": "<segredo TOTP em Base32>",
"qrcode": "<imagem PNG em Base64>"
}| 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 padrão. No aplicativo, a conta aparece como <rest_name> (Riversoft Config API), com o nome do operador. |
Para exibir o QR code, use o valor direto em uma URL data::
imagem.src = `data:image/png;base64,${resposta.qrcode}`;O cadastro segue estes passos:
- Exiba o QR code e o segredo e peça ao operador 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 para o caminho recebido em
URL, como em Responder o desafio. - Com o código válido, a API responde
200com o token. O login está concluído; nos próximos logins, a resposta traz só aURL.
Importante
O segredo é gravado já na primeira etapa. Se o operador não concluir o primeiro login, o QR code não é exibido de novo. Nesse caso, um operador com a permissão stcpadminsvc.main_oper_reset_pwd deve redefinir a 2FA em POST /stcpadminsvc/v2/supervision/stcpauth/reset/operator/2fa (veja Recursos de gestão). Um novo segredo é gerado no login seguinte.
Erros
| HTTP | Situação |
|---|---|
400 | grant_type diferente de password, username ou password ausente, ou corpo vazio. No desafio: corpo vazio, JSON inválido ou Content-Type diferente de application/json. |
401 | Credenciais não aceitas, operador bloqueado (Operator is locked, contact your system administrator), código inválido (Invalid code) ou desafio inexistente (You need to authenticate first at /oauth/token). |
415 | Content-Type diferente de application/x-www-form-urlencoded no login. |
500 | Erro interno. |
Os erros vêm em JSON, com error e error_description.
Atenção
O desafio aceita três códigos errados. No quarto, o operador é bloqueado e o desafio, descartado: um operador com permissão precisa desbloqueá-lo. O segredo TOTP é um dado sensível: exiba-o somente para o próprio operador e não o registre em logs.