Saltar al contenido principal

Cómo conectarse a endpoints con el flujo de Código de Autorización de OAuth 2.0 con PKCE

Cómo conectarse a los endpoints

Para autenticar a tus usuarios, tu App deberá implementar un flujo de autorización. Este flujo te permite dirigir a tus usuarios a un diálogo de autorización en X. A partir de ahí, la experiencia principal de X mostrará el diálogo y gestionará la autorización en nombre de tu App. Tus usuarios podrán autorizar tu App o rechazar el permiso. Una vez que el usuario tome su decisión, X lo redirigirá a tu App, donde podrás canjear el código de autorización por un access token (si el usuario autorizó tu App) o gestionar un rechazo (si no la autorizó).

Trabajar con clientes confidenciales

Si trabaja con clientes confidenciales, deberá usar un esquema de autenticación básica para generar un encabezado de autorización con codificación base64 al hacer solicitudes a los endpoints de tokens. El userid y la password se separan con un único carácter de dos puntos (”:”) dentro de una cadena codificada en base64 en las credenciales. Un ejemplo sería: -header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA==' Si el agente de usuario desea enviar el Client ID “Aladdin” y la contraseña “open sesame”, usaría el siguiente campo de encabezado: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Para crear el encabezado de autorización básica, deberá aplicar codificación base64 a su Client ID y Client Secret, que puede obtener en la página “Keys and Tokens” de su App dentro del portal de desarrolladores.

Pasos para conectarse con OAuth 2.0

Paso 1: Construir una URL de autorización Tu App deberá construir una URL de autorización a X, indicando los scopes que tu App necesita autorizar. Por ejemplo, si tu App necesita consultar Tweets, usuarios y gestionar follows, debería solicitar los siguientes scopes: tweet.read%20users.read%20follows.read%20follows.write La URL también incluirá los parámetros code_challenge y state, además de los otros parámetros requeridos. En producción, debes usar una cadena aleatoria para el code_challenge. Paso 2: GET oauth2/authorize Haz que el usuario se autentique y envíe a la aplicación un código de autorización. Si has habilitado OAuth 2.0 para tu App, puedes encontrar tu Client ID en la página “Keys and Tokens” de tu App. Un ejemplo de URL a la que redirigir al usuario se vería así:
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20follows.write&state=state&code_challenge=challenge&code_challenge_method=plain
Un ejemplo de URL con offline_access tendría este aspecto:
https://x.com/i/oauth2/authorize?response_type=code&client_id=M1M5R3BMVy13QmpScXkzTUt5OE46MTpjaQ&redirect_uri=https://www.example.com&scope=tweet.read%20users.read%20follows.read%20offline.access&state=state&code_challenge=challenge&code_challenge_method=plain
Tras una autenticación correcta, el redirect_uri recibiría una solicitud que contiene el parámetro auth_code. Su aplicación debe verificar el parámetro state. Un ejemplo de solicitud desde la redirección del cliente sería:
https://www.example.com/?state=state&code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE
Paso 3: POST oauth2/token - Access Token En este punto, puede usar el código de autorización para crear un access token y un refresh token (solo si se solicita el scope offline.access). Puede hacer una solicitud POST al siguiente endpoint:
https://api.x.com/2/oauth2/token
Deberá incluir el Content-Type application/x-www-form-urlencoded en un encabezado. Además, su solicitud debe incluir: code, grant_type, client_id, redirect_uri y code_verifier. A continuación se muestra un ejemplo de solicitud de token para un cliente público:
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
A continuación, se muestra un ejemplo con un cliente confidencial:
curl --location --request POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'code=VGNibzFWSWREZm01bjN1N3dicWlNUG1oa2xRRVNNdmVHelJGY2hPWGxNd2dxOjE2MjIxNjA4MjU4MjU6MToxOmFjOjE' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://www.example.com' \
--data-urlencode 'code_verifier=challenge'
Paso 4: Conectarse a las APIs Ahora está listo para conectarse a los endpoints usando OAuth 2.0. Para hacerlo, realizará la solicitud a la API como lo haría usando la autenticación con Bearer Token. En lugar de enviar su Bearer Token, debe usar el access token que generó en el paso anterior. Como respuesta, debería ver el payload correspondiente al endpoint que está solicitando. Esta solicitud es la misma tanto para clientes públicos como para clientes confidenciales. Un ejemplo de la solicitud que haría se vería de la siguiente manera:
curl --location --request GET 'https://api.x.com/2/tweets?ids=1261326399320715264,1278347468690915330' \
--header 'Authorization: Bearer Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
Paso 5: POST oauth2/token - refresh token Un refresh token permite que una aplicación obtenga un nuevo access token sin solicitar la intervención del usuario. Puedes crear un refresh token realizando una solicitud POST al siguiente endpoint: https://api.x.com/2/oauth2/token. Deberás agregar el Content-Type application/x-www-form-urlencoded mediante un encabezado. Además, deberás incluir tu refresh_token, establecer grant_type en refresh_token y definir tu client_id. Esta solicitud funcionará para clientes públicos:
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
Aquí tienes un ejemplo para clientes confidenciales:
POST 'https://api.x.com/2/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE'\
--data-urlencode 'grant_type=refresh_token'
Paso 6: POST oauth2/revoke - Revocar el token Un revoke token invalida un access token o refresh token. Esto se utiliza para habilitar una función de “cerrar sesión” en los clientes, lo que le permite eliminar cualquier credencial de seguridad asociada con el flujo de autorización que ya no sea necesaria. El revoke token es para que una App revoque un token y no un usuario. Puede crear una solicitud de revoke token realizando una solicitud POST a la siguiente URL si la App desea revocar de forma programática el acceso que se le otorgó:
https://api.x.com/2/oauth2/revoke
Deberá incluir el Content-Type application/x-www-form-urlencoded en un encabezado, junto con su token y su client_id. En algunos casos, un usuario puede querer revocar el acceso concedido a una App; puede hacerlo visitando la página de Apps conectadas.
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
Esta solicitud funcionará para clientes confidenciales:
curl --location --request POST 'https://api.x.com/2/oauth2/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic V1ROclFTMTRiVWhwTWw4M2FVNWFkVGQyTldNNk1UcGphUTotUm9LeDN4NThKQThTbTlKSXQyZm1BanEzcTVHWC1icVozdmpKeFNlR3NkbUd0WEViUA=='\
--data-urlencode 'token=Q0Mzb0VhZ0V5dmNXSTEyNER2MFNfVW50RzdXdTN6STFxQlVkTGhTc1lCdlBiOjE2MjIxNDc3NDM5MTQ6MToxOmF0OjE'
I