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
- Gerar PKCE — Crie um
code_verifier(string aleatória) e derivecode_challenge= BASE64URL(SHA256(code_verifier)). Gere também umstatealeatório para proteção CSRF. - Redirecionar para a Deriv — Envie o utilizador para o URL de autorização da Deriv com todos os parâmetros obrigatórios.
- 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.
- Redirecionar de volta — A Deriv redireciona o utilizador para o seu
redirect_uricom umcódigode autorização estate. - Verificar state — Confirme que o
statedevolvido corresponde ao que armazenou. Isto previne ataques CSRF. - Trocar código por token — O seu backend envia o
código+code_verifierpara o endpoint de token da Deriv e recebe umaccess_token. - 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_ide umredirect_uripré-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
O que é o PKCE?
PKCE (Proof Key for Code Exchange, pronunciado 'pixi') previne ataques de interceção de código de autorização. Mesmo que um atacante intercete o código de autorização, não pode trocá-lo sem o code_verifier original que apenas a sua aplicação gerou e armazenou.
Porquê funciona: Apenas a app que gerou o code_verifier pode completar a troca de token.
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)
Dica de armazenamento
code_verifier e state em sessionStorage antes de redirecionar — sobrevivem ao redirecionamento e são automaticamente limpos quando o separador é fechado. Limpe-os do armazenamento imediatamente após uma troca de token bem-sucedida.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/authLogin
O login usa os parâmetros OAuth2 + PKCE padrão sem adições.
Parâmetros
Â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.
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=S256Também mantém uma app API Legada?
&app_id=YOUR_LEGACY_APP_ID ao URL de início de sessão (e URL de registo). A Deriv verificará se o utilizador pertence à plataforma antiga ou nova e encaminhá-lo-á para a versão apropriada da sua aplicação.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.comRegiste-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â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.
Que parâmetro de rastreamento devo usar?
t, affiliate_token, sidi e ca servem todos o mesmo propósito. Use aquele que aparece no seu link de referência Deriv ou no seu painel Partners — não inclua mais do que um.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. CU303219Importante
state no retorno e gere o seu code_challenge a partir de um code_verifier aleatório seguro. Nunca reutilize estes valores entre pedidos.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_STATESe algo correu mal:
https://yourapp.com/callback?error=access_denied&error_description=User+cancelledA sua app deve:
- Verificar o state — compare o
statedo URL com o valor que armazenou antes do redirecionamento. Se não corresponderem, aborte — pode ser um ataque CSRF. - Extrair o código — leia o parâmetro de query
code.
O código de autorização é de utilização única e expira rapidamente
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/tokenCorpo 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/callbackExemplo 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_TOKENExemplo
curl -X GET "https://api.derivws.com/trading/v1/options/accounts" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"Referência rápida
Onde encontrar os seus valores:
Resolução de Problemas
Lista de verificação de implementação
Login
response_typeécodeclient_ideredirect_uriestão registados na Derivcode_challengeestatesão gerados de novo para cada pedidocode_verifieré armazenado emsessionStorageantes do redirecionamento- O callback verifica o
stateantes 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_idestá definido para o seu ID de app Legacy (opcional)
Registo (adicional)
promptestá definido pararegistration(obrigatório)- Token de rastreamento (um de
t,affiliate_token,sidi,ca)utm_source,utm_campaign, eutm_mediumsão definidos se necessário — use o nome do parâmetro mostrado na sua ligação de referência ou painel de Parceiros (opcional)
Alguma outra questão? Entrar em contacto