Deriv API
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.
  • 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
codeRequest an authorization code
client_idObrigatório
Your app IDRegistered OAuth2 application ID from Deriv
redirect_uriObrigatório
Your callback URLMust exactly match the URI registered with 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 stringCSRF protection — generate a new value for each request
code_challengeObrigatório
BASE64URL(SHA256(verifier))The PKCE challenge derived from code_verifier
code_challenge_methodObrigatório
S256Always SHA-256
app_idOpcional
Your legacy app IDYour V1 app ID from the Legacy Deriv API — include this only if you also maintain a legacy API app

Â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

URL de login com suporte para app legada

https://auth.deriv.com/oauth2/auth?
  response_type=code
  &client_id={YOUR_CLIENT_ID}
  &redirect_uri={YOUR_REDIRECT_URI}
  &scope=trade+account_manage
  &state={RANDOM_STATE}
  &code_challenge={PKCE_CHALLENGE}
  &code_challenge_method=S256
  &app_id={YOUR_LEGACY_APP_ID}      # V1 app ID from legacy-api.deriv.com

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_campaignYour campaign nameIdentifies the marketing campaign
utm_mediumaffiliateIndicates a partner integration
utm_sourceYour affiliate IDCommission tracking and reporting

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": 3600,
  "token_type": "Bearer"
}

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"

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_idRegister an OAuth2 app with Deriv — you'll receive an app ID
redirect_uriSet during app registration — must match exactly
t / affiliate_token / sidi / ca (signup)Your referral link or the Partners dashboard — use the exact parameter name shown there
utm_source / affiliate ID (signup)Managed and set in the Partners dashboard
utm_campaign (signup)Managed and set in the Partners dashboard
app_id (legacy)Your V1 app ID from legacy-api.deriv.com — only needed if you maintain a Legacy API app

Resolução de Problemas

ProblemaCausa provávelCorreção
State mismatch errorstate in the callback doesn't match stored valueStore state in sessionStorage before redirecting, and don't regenerate it on page load
invalid_grant on token exchangecode_verifier doesn't match the challenge, or code expired/already usedSend the original code_verifier, not a newly generated one; exchange the code immediately
Redirect URI mismatchURL doesn't exactly match what's registeredCheck for trailing slashes, http vs https, port numbers
invalid_clientWrong client_idVerify your credentials from the Deriv dashboard
Login form shows instead of signupMissing prompt=registrationAdd prompt=registration to the authorization URL
Signup not tracked to partnerMissing or wrong UTM parametersVerify your tracking token parameter (one of t, affiliate_token, sidi, or ca) matches the one shown in your referral link, and that utm_source, utm_medium, and utm_campaign are all present and correct

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
  • Se mantiver uma app legada, app_id está definido para o seu ID de app Legacy (opcional)

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.