Skip to main content

Autorizando uma solicitação

O objetivo deste documento é mostrar como modificar solicitações HTTP para enviar solicitações autorizadas à X API. Todas as APIs do X são baseadas no protocolo HTTP. Isso significa que qualquer software que você escreva usando as APIs do X envia uma série de mensagens estruturadas para os servidores do X. Por exemplo, uma solicitação para publicar o texto “Hello Ladies + Gentlemen, a signed OAuth request!” como um Tweet será mais ou menos assim:
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
Qualquer biblioteca HTTP deve ser capaz de gerar e emitir a solicitação acima com pouca dificuldade. No entanto, a solicitação acima é considerada inválida, pois não há como saber:
  1. Qual aplicação está fazendo a solicitação
  2. Em nome de qual usuário a solicitação está publicando
  3. Se o usuário concedeu à aplicação autorização para publicar em seu nome
  4. Se a solicitação foi adulterada por terceiros em trânsito
Para permitir que as aplicações forneçam essas informações, a API do X se baseia no protocolo OAuth 1.0a. Em um nível bem simplificado, a implementação do X exige que solicitações que requerem autorização contenham um header HTTP Authorization adicional com informações suficientes para responder às perguntas listadas acima. Uma versão da solicitação HTTP mostrada acima, modificada para incluir esse header, se parece com isto (normalmente o header Authorization precisa ficar em uma única linha, mas foi quebrado aqui para melhor leitura):
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth\_signature\_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
Quando esta solicitação foi criada, ela seria aceita como válida pela X API. Se este processo de assinatura parece estar fora do escopo da sua integração, considere usar Web Intents, que não precisam usar OAuth para interagir com a X API. Coletando parâmetros Você deve conseguir ver que o header contém 7 pares chave/valor, em que todas as chaves começam com a string “oauth_”. Para qualquer solicitação da X API, coletar esses 7 valores e criar um header semelhante permitirá especificar a autorização da solicitação. Como cada valor foi gerado é descrito abaixo: Consumer key O oauth_consumer_key identifica qual aplicação está fazendo a solicitação. Obtenha esse valor na página de configurações do seu X app no Developer Console.
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce O parâmetro oauth_nonce é um token único que sua aplicação deve gerar para cada solicitação única. O X usará esse valor para determinar se uma solicitação foi enviada várias vezes. O valor desta solicitação foi gerado codificando em base64 32 bytes de dados aleatórios e removendo todos os caracteres não-word, mas qualquer abordagem que produza uma string alfanumérica relativamente aleatória deve funcionar aqui.
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature O parâmetro oauth_signature contém um valor gerado ao passar todos os outros parâmetros da solicitação e dois valores secretos por um algoritmo de assinatura. O propósito da assinatura é permitir que o X verifique se a solicitação não foi modificada em trânsito, verifique a aplicação que envia a solicitação e verifique se a aplicação tem autorização para interagir com a conta do usuário. O processo para calcular o oauth_signature desta solicitação é descrito em Criando uma assinatura.
oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY=
Signature method O oauth_signature_method usado pelo X é HMAC-SHA1. Esse valor deve ser usado para qualquer solicitação autorizada enviada à API do X.
oauth_signature_methodHMAC-SHA1
Timestamp O parâmetro oauth_timestamp indica quando a solicitação foi criada. Esse valor deve ser o número de segundos desde a epoch Unix no momento em que a solicitação é gerada, e deve ser fácil de gerar na maioria das linguagens de programação. O X rejeitará solicitações criadas em um passado muito distante, então é importante manter o relógio do computador que gera as solicitações sincronizado via NTP.
oauth_timestamp1318622958
Token O parâmetro oauth_token normalmente representa a permissão de um usuário para compartilhar acesso à sua conta com sua aplicação. Existem algumas solicitações de autenticação em que esse valor não é passado ou é outra forma de token, mas essas são abordadas em detalhes em Obtendo access tokens. Para a maioria das solicitações de uso geral, você usará o que chamamos de access token. Você pode gerar um access token válido para sua conta na página de configurações do seu X app no Developer Console.
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
Version O parâmetro oauth_version deve sempre ser 1.0 em qualquer solicitação enviada à API do X.
oauth_version1.0

Construindo a string do header

Para construir a string do header, imagine que você está escrevendo em uma string chamada DST.
  1. Anexe a string “OAuth ” (incluindo o espaço no final) a DST.
  2. Para cada par chave/valor dos 7 parâmetros listados acima:
    1. Faça o percent encode da chave e anexe-a a DST.
    2. Anexe o caractere de igual ‘=’ a DST.
    3. Anexe aspas duplas ‘”’ a DST.
    4. Faça o percent encode do valor e anexe-o a DST.
    5. Anexe aspas duplas ‘”’ a DST.
    6. Se houver mais pares chave/valor, anexe uma vírgula ‘,’ e um espaço ‘ ‘ a DST.
Preste atenção especial ao percent encoding dos valores ao construir essa string. Por exemplo, o valor de oauth_signature tnnArxj06cWHq44gCs1OSKk/jLY= deve ser codificado como tnnArxj06cWHq44gCs1OSKk%2FjLY%3D. Executar esses passos com os parâmetros coletados acima resulta na seguinte string:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog", oauth\_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth\_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth\_signature\_method="HMAC-SHA1", oauth\_timestamp="1318622958", oauth\_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"
Esse valor deve ser definido como o header Authorization da solicitação.