Documentação
Introdução

OAuth 2.0

Um guia completo para implementar Login e Registo usando o fluxo de Código de Autorização OAuth 2.0 da Deriv com PKCE.

Como o fluxo funciona

1
Gerar PKCE
2
Redirecionar para a Deriv
3
Utilizador Autentica
4
Código de Troca
5
Usar Token
  1. Gerar PKCE — Crie um code_verifier (string aleatória) e derive code_challenge = BASE64URL(SHA256(code_verifier)). Gere também um state aleatório para proteção CSRF.
  2. Redirecionar para a Deriv — Envie o utilizador para o URL de autorização da Deriv com todos os parâmetros obrigatórios.
  3. Utilizador autentica-se — A Deriv mostra o formulário de início de sessão ou de registo. Todos os ecrãs de início de sessão e consentimento são geridos pelo fornecedor OAuth.
  4. Redirecionar de volta — A Deriv redireciona o utilizador para o seu redirect_uri com um código de autorização e state.
  5. Verificar state — Confirme que o state devolvido corresponde ao que armazenou. Isto previne ataques CSRF.
  6. Trocar código por token — O seu backend envia o código + code_verifier para o endpoint de token da Deriv e recebe um access_token.
  7. Usar o token — Fazer chamadas de API autenticadas usando o token Bearer.

Antes de começar

Necessita de:

  • Um cliente OAuth2 registado da Deriv com um client_id e um redirect_uri pré-registado.
  • HTTPS ativado no seu URL de redirecionamento. Para desenvolvimento local, pode utilizar http://localhost.
  • A sua app deve lidar com redirecionamentos, ler o código de autorização e trocá-lo por tokens.

Passo 1: Gerar parâmetros PKCE

Gerar PKCE em JavaScript

// 1. Generate a random code_verifier
const array = crypto.getRandomValues(new Uint8Array(64));
const codeVerifier = Array.from(array)
  .map(v => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'[v % 66])
  .join('');

// 2. Derive the code_challenge
const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
const codeChallenge = btoa(String.fromCharCode(...new Uint8Array(hash)))
  .replace(/\+/g, '-')
  .replace(/\//g, '_')
  .replace(/=+$/, '');

// 3. Generate a random state for CSRF protection
const state = crypto.getRandomValues(new Uint8Array(16))
  .reduce((s, b) => s + b.toString(16).padStart(2, '0'), '');

// 4. Store code_verifier and state before redirecting
sessionStorage.setItem('pkce_code_verifier', codeVerifier);
sessionStorage.setItem('oauth_state', state);

Parâmetros de pedido de autorização obrigatórios:

  • response_type=code
  • client_id
  • redirect_uri
  • scope
  • state
  • code_challenge + code_challenge_method=S256 (PKCE)

Passo 2: Redirecionar o utilizador para o endpoint de autorização

Envie os utilizadores para o endpoint de autorização OAuth 2.0 da Deriv:

https://auth.deriv.com/oauth2/auth

Login

O login usa os parâmetros OAuth2 + PKCE padrão sem adições.

Parâmetros

ParâmetroValorDescrição
response_typeObrigatório
codeSolicite um código de autorização
client_idObrigatório
Your app IDID de aplicação OAuth2 registada em Deriv
redirect_uriObrigatório
Your callback URLTem de corresponder exatamente ao URI registado em Deriv
scopeObrigatório
tradeaccount_manageapplication_readpayment
Lista, separada por espaços, das permissões que a sua aplicação pede — consulte a tabela de âmbitos OAuth abaixo
stateObrigatório
Random stringProteção CSRF — gerar um novo valor para cada pedido
code_challengeObrigatório
BASE64URL(SHA256(verifier))O desafio PKCE derivado de code_verifier
code_challenge_methodObrigatório
S256Sempre SHA-256

Âmbitos de OAuth

O parâmetro scope é uma lista, separada por espaços, das permissões que a sua aplicação pede. Peça apenas os âmbitos de que a sua aplicação necessita.

PermissãoDescrição
tradeAcesso a operações de negociação.
account_manageAcesso de escrita para criação e gestão de contas.
application_readAcesso apenas de leitura às suas aplicações registadas.
paymentAcesso a operações de depósito e levantamento de agentes de pagamento.

URL de Login

https://auth.deriv.com/oauth2/auth?
  response_type=code
  &client_id={YOUR_CLIENT_ID}          # e.g. app12345
  &redirect_uri={YOUR_REDIRECT_URI}    # e.g. https://yourapp.com/callback
  &scope=trade+account_manage
  &state={RANDOM_STATE}                # e.g. abc123random
  &code_challenge={PKCE_CHALLENGE}     # e.g. E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256

Registe-se

O registo utiliza o mesmo URL base e parâmetros que o início de sessão, mais um parâmetro obrigatório adicional:

Parâmetro de registo obrigatório

ParâmetroValorDescrição
promptObrigatório
registrationSempre este valor exato. Diz à Deriv para mostrar o formulário de registo em vez de login.

Parâmetros de atribuição de parceiro opcionais

Os seguintes parâmetros são todos opcionais e geridos no painel Partners. Inclua-os para atribuir registos à sua conta de parceiro. O parâmetro de token de rastreamento tem quatro nomes equivalentes (t, affiliate_token, sidi, ca) — use aquele que aparece no seu link de referência ou painel Partners.

ParâmetroValorFinalidade
taffiliate_tokensidica
O seu token de rastreamento de afiliadoRastreamento e atribuição. Use apenas um destes nomes de parâmetro — são aliases equivalentes. Escolha aquele que aparece no seu link de referência ou no painel Partners.
utm_campaignO nome da sua campanhaIdentifica a campanha de marketing
utm_mediumaffiliateIndica uma integração de parceiro
utm_sourceO seu ID de afiliadoRastreio e relatórios de comissões

URL de Registo

https://auth.deriv.com/oauth2/auth?
  response_type=code
  &client_id={YOUR_CLIENT_ID}          # e.g. app12345
  &redirect_uri={YOUR_REDIRECT_URI}    # e.g. https://yourapp.com/callback
  &scope=trade+account_manage
  &state={RANDOM_STATE}                # e.g. abc123random
  &code_challenge={PKCE_CHALLENGE}     # e.g. E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
  &prompt=registration
  &t={YOUR_TRACKING_TOKEN}             # or: affiliate_token | sidi | ca — use the name from your referral link
  &utm_campaign={YOUR_CAMPAIGN}        # e.g. dynamicworks
  &utm_medium=affiliate
  &utm_source={YOUR_AFFILIATE_ID}      # e.g. CU303219

Passo 3: Lidar com o callback

Quer o utilizador tenha iniciado sessão ou se tenha registado, o callback funciona exatamente da mesma forma. Após a autenticação, a Deriv redireciona para o seu redirect_uri:

https://yourapp.com/callback?code=AUTHORIZATION_CODE&state=RANDOM_STATE

Se algo correu mal:

https://yourapp.com/callback?error=access_denied&error_description=User+cancelled

A sua app deve:

  1. Verificar o state — compare o state do URL com o valor que armazenou antes do redirecionamento. Se não corresponderem, aborte — pode ser um ataque CSRF.
  2. Extrair o código — leia o parâmetro de query code.

Passo 4: Trocar código por tokens

Faça um pedido POST do seu backend para o endpoint de token. Nunca realize a troca de token a partir do navegador.

POST https://auth.deriv.com/oauth2/token

Corpo do pedido (codificado em formulário)

grant_type=authorization_code
client_id=YOUR_CLIENT_ID
code=AUTH_CODE_FROM_CALLBACK
code_verifier=YOUR_ORIGINAL_CODE_VERIFIER
redirect_uri=https://your-app.com/callback

Exemplo cURL

curl -X POST https://auth.deriv.com/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "code=AUTH_CODE" \
  -d "code_verifier=YOUR_CODE_VERIFIER" \
  -d "redirect_uri=https://your-app.com/callback"

Resposta de token

{
  "access_token": "ory_at_...",
  "expires_in": 2592000,
  "token_type": "Bearer"
}

expires_in é a duração do token em segundos. A resposta não inclui um token de atualização — consulte Duração e renovação do token.

Passo 5: Usar o token de acesso em chamadas de API

Inclua o token de acesso como um token Bearer no cabeçalho Authorization para todas as chamadas API:

Authorization: Bearer YOUR_ACCESS_TOKEN

Exemplo

curl -X GET "https://api.derivws.com/trading/v1/options/accounts" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Duração e renovação de tokens

Todos os tokens de acesso expiram. Consulte a respetiva duração em segundos em expires_in na resposta do token e, em seguida, guarde a hora de expiração (a hora em que recebeu o token mais expires_in) com o token. Não codifique uma duração fixa — esta pode mudar.

Para obter um novo token de acesso, encaminhe novamente o utilizador pelo fluxo de autorização (Authorization Code + PKCE) a partir do passo 1 quando:

  • O número de segundos indicado em expires_in decorreu
  • Uma chamada de API devolve 401

Se um novo token de acesso também receber um 401, não inicie novamente o fluxo. Em vez disso, verifique o Authorization cabeçalho e o endpoint.

Referência rápida

EndpointURL
Autorizaçãohttps://auth.deriv.com/oauth2/auth
Troca de tokenhttps://auth.deriv.com/oauth2/token
URL base da APIhttps://api.derivws.com

Onde encontrar os seus valores:

ValorOnde
client_idRegiste uma aplicação OAuth2 com Deriv — receberá um ID da aplicação
redirect_uriDefinido durante o registo da aplicação — tem de corresponder exatamente
t / affiliate_token / sidi / ca (signup)A sua ligação de referência ou o painel de Parceiros — utilize o nome exato do parâmetro aí apresentado
utm_source / affiliate ID (signup)Gerido e definido no painel de Parceiros
utm_campaign (signup)Gerido e definido no painel de Parceiros

Resolução de Problemas

ProblemaCausa provávelCorreção
Erro de incompatibilidade de estadostate no callback não corresponde ao valor armazenadoGuarde state em sessionStorage antes de redirecionar e não o gere novamente ao carregar a página
invalid_grant na troca de tokencode_verifier não corresponde ao desafio, ou o código expirou/já foi utilizadoEnvie o code_verifier original, e não um gerado novamente; troque o código imediatamente
Incompatibilidade do URI de redirecionamentoO URL não corresponde exatamente ao que está registadoVerifique as barras finais, http vs https e os números de porta
invalid_clientclient_id incorretoVerifique as suas credenciais no Deriv painel
É apresentado o formulário de início de sessão em vez do registoFalta prompt=registrationAdicione prompt=registration ao URL de autorização
Registo não associado ao parceiroParâmetros UTM em falta ou incorretosVerifique se o parâmetro do seu token de rastreio (um de t, affiliate_token, sidi ou ca) corresponde ao apresentado na sua ligação de referência e se utm_source, utm_medium e utm_campaign estão todos presentes e corretos
401 em chamadas que anteriormente funcionavamO token de acesso expirouExecute novamente o fluxo de autorização a partir do passo 1 para obter um novo token de acesso — não existe token de atualização

Lista de verificação de implementação

Login

  • response_type é code
  • client_id e redirect_uri estão registados na Deriv
  • code_challenge e state são gerados de novo para cada pedido
  • code_verifier é armazenado em sessionStorage antes do redirecionamento
  • O callback verifica o state antes de trocar o código
  • A troca de token acontece do lado do servidor (não no navegador)
  • code_verifier é limpo do armazenamento após uso
  • O fluxo de autorização é executado novamente quando o token expira ou uma chamada devolve 401, mas não quando um novo token de acesso também recebe um 401

Registo (adicional)

  • prompt está definido para registration (obrigatório)
  • Token de rastreamento (um de t, affiliate_token, sidi, ca) utm_source, utm_campaign, e utm_medium são definidos se necessário — use o nome do parâmetro mostrado na sua ligação de referência ou painel de Parceiros (opcional)
Click to open live chat support. Get instant help from our support team.