Note
Considera la posibilidad de crear una GitHub App en lugar de una OAuth app.
Tanto las OAuth apps como las GitHub Apps usan OAuth 2.0.
Las GitHub Apps pueden actuar en nombre de un usuario, de forma parecida a una OAuth app, o bien en su propio nombre, lo que resulta ventajoso para las automatizaciones que no requieren que el usuario introduzca datos. Además, las GitHub Apps usan la personalización avanzada de permisos, proporcionan al usuario más control sobre los repositorios a los que puede acceder la aplicación y usan tokens de corta duración. Para más información, consulta Diferencias entre aplicaciones de GitHub y aplicaciones de OAuth y Acerca de la creación de GitHub Apps.
La implementación OAuth de GitHub admite el tipo de concesión de código de autorización estándar y la concesión de autorización de dispositivos de OAuth 2.0 para aplicaciones que no tienen acceso a un explorador web.
Si quiere omitir la autorización de la aplicación de la manera estándar, como al probar la aplicación, puede usar el flujo de aplicación no web.
Para autorizar tu OAuth app, considera qué flujo de autorizaciones queda mejor con ella.
- Flujo de aplicaciones web: se usa para autorizar a los usuarios para las OAuth apps estándar que se ejecutan en el explorador. (No se admite el tipo de concesión implícita).
- flujo de dispositivo: se usa para aplicaciones sin encabezado, como herramientas de la CLI.
Flujo de aplicaciones Web
Note
Si vas a compilar una aplicación de GitHub, todavía puedes utilizar el flujo de aplicaciones web de OAuth, pero la configuración presenta algunas diferencias importantes. Para obtener más información, consulta Autenticación con una aplicación de GitHub en nombre de un usuario.
El flujo web de aplicaciones para autorizar a los usuarios en tu app es:
- Se redirecciona a los usuarios para solicitar su identidad de GitHub
- GitHub redirecciona a los usuarios de vuelta a tu sitio
- Tu aplicación accede a la API con el token de acceso del usuario
1. Solicitud de la identidad de un usuario de GitHub
GET https://github.com/login/oauth/authorize
Este punto de conexión toma los siguientes parámetros de entrada.
Parámetro de consulta | Tipo | ¿Necesario? | Descripción |
---|---|---|---|
client_id | string | Obligatorio | El id. de cliente que ha recibido de GitHub al registrarse. |
redirect_uri | string | Se recomienda encarecidamente | La URL en tu aplicación a donde se enviará a los usuarios después de la autorización. Vea los detalles siguientes sobre las URL de redireccionamiento. |
login | string | Opcionales | Sugiere una cuenta específica para utilizar para registrarse y autorizar la app. |
scope | string | Dependiente del contexto | Lista de ámbitos delimitada por espacios. Si no se proporciona, de manera predeterminada scope será una lista vacía para los usuarios que no han autorizado ningún ámbito para la aplicación. Para los usuarios que han autorizado alcances para la aplicación, el usuario no se mostrará en la página de autorización de OAuth con la lista de alcances. En vez de esto, este paso del flujo se completara automáticamente con el conjunto de alcances que el usuario haya autorizado para la aplicación. Por ejemplo, si un usuario ya ha realizado el flujo web dos veces y ha autorizado un token con ámbito user y otro con ámbito repo , un tercer flujo web que no proporcione un valor scope recibirá un token con el ámbito user y repo . |
state | string | Se recomienda encarecidamente | Una secuencia aleatoria indescifrable. Se utiliza para protegerte contra los ataques de falsificación de solicitudes entre sitios. |
allow_signup | string | Opcionales | Ya sea que se ofrezca o no una opción para registrarse en GitHub a los usuarios sin autenticar durante el flujo de OAuth, El valor predeterminado es true . Use false cuando una directiva prohíba los registros. |
prompt | string | Opcionales | Obliga a que el selector de cuentas aparezca si se configura como select_account . El selector de cuentas también aparecerá si la aplicación tiene un URI de redirección no HTTP o si el usuario tiene varias cuentas iniciadas. |
Los parámetros PKCE (Proof Key for Code Exchange, es decir, Clave de prueba para intercambio de código) code_challenge
y code_challenge_method
no se admiten en este momento. Actualmente no se admiten las solicitudes anteriores al lanzamiento de CORS (OPCIONES).
2. GitHub redirecciona a los usuarios de vuelta al sitio
Si el usuario acepta la solicitud, GitHub le redirecciona de vuelta al sitio con un valor code
temporal en un parámetro de código y con el estado que haya proporcionado en el paso anterior en un parámetro state
. El código temporal caducará después de 10 minutos. Si los estados no empatan, entonces un tercero creó la solicitud, y debes abandonar el proceso.
Intercambie este valor code
por un token de acceso:
POST https://github.com/login/oauth/access_token
Este punto de conexión toma los siguientes parámetros de entrada.
Nombre de parámetro | Tipo | ¿Necesario? | Descripción |
---|---|---|---|
client_id | string | Obligatorio | El id. de cliente que ha recibido de GitHub para la OAuth app. |
client_secret | string | Obligatorio | El secreto de cliente que ha recibido de GitHub para la OAuth app. |
code | string | Obligatorio | Código que ha recibido como respuesta al paso 1. |
redirect_uri | string | Se recomienda encarecidamente | La URL en tu aplicación, hacia la cual se envía a los usuarios después de su autorización. Podemos usar esto para buscar coincidencias con el URI proporcionado originalmente cuando code se emitió, para evitar ataques contra el servicio. |
Predeterminadamente, la respuesta toma la siguiente forma:
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
También puede recibir la respuesta en diferentes formatos si proporciona el formato en el encabezado Accept
. Por ejemplo, Accept: application/json
o Accept: application/xml
:
Accept: application/json
{
"access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
"scope":"repo,gist",
"token_type":"bearer"
}
Accept: application/xml
<OAuth>
<token_type>bearer</token_type>
<scope>repo,gist</scope>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
</OAuth>
3. Uso del token de acceso para acceder a la API
El token de acceso te permite hacer solicitudes a la API a nombre de un usuario.
Authorization: Bearer OAUTH-TOKEN
GET https://api.github.com/user
Por ejemplo, en curl, puedes configurar el encabezado de autorización de la siguiente manera:
curl -H "Authorization: Bearer OAUTH-TOKEN" https://api.github.com/user
Cada vez que recibas un token de acceso, debes usar el token para volver a validar la identidad del usuario. Un usuario puede cambiar la cuenta de inicio de sesión al enviarlos para autorizar la aplicación y corre el riesgo de mezclar datos de usuario si no valida la identidad del usuario después de cada inicio de sesión.
Flujo de dispositivos
Este flujo de dispositivos te permite autorizar usuarios para una app sin encabezado, tal como una herramienta de CLI o el administrador de credenciales de Git.
Antes de que puedas utilizar el flujo de dispositivos para autorizar e identificar usuarios, primero debes habilitarlo en los ajustes de tu app. Para obtener más información sobre cómo habilitar el flujo de dispositivo en la aplicación, consulta Modificación del registro de una instancia de GitHub App para GitHub Apps y Modificación de una aplicación de OAuth para OAuth apps.
Resumen del flujo de dispositivos
- Tu app solicita el dispositivo y los códigos de verificación de usuario y obtiene una URL de autoización en donde el usuario ingresará su código de verificación de usuario.
- La app pide al usuario ingresar un código de verificación de usuario en
https://github.com/login/device
. - La app sondea el estado de autenticación del usuario. Una vez que el usuario haya autorizado el dispositivo, la app podrá hacer llamadas a la API con un token de acceso nuevo.
Paso 1: La app solicita los códigos de dispositivo y de usuario a GitHub
POST https://github.com/login/device/code
Tu app debe solicitar un código de verificación de usuario y una URL de verificación que la app utilizará para indicar al usuario que se autentique en el siguiente paso. Esta solicitud también devuelve un código de verificación de dispositivo que debe utilizar la app para recibir un token de acceso y verificar así el estado de la autenticación del usuario.
El punto de conexión toma los siguientes parámetros de entrada.
Nombre de parámetro | Type | Descripción |
---|---|---|
client_id | string | Obligatorio. Id. de cliente que ha recibido de GitHub para la aplicación. |
scope | string | Lista delimitada por espacios de los ámbitos a los que la aplicación solicita acceso. Para más información, consulta Ámbitos para las aplicaciones de OAuth. |
Predeterminadamente, la respuesta toma la siguiente forma:
device_code=3584d83530557fdd1f46af8289938c8ef79f9dc5&expires_in=900&interval=5&user_code=WDJB-MJHT&verification_uri=https%3A%2F%2Fgithub.com%2Flogin%2Fdevice
Nombre de parámetro | Type | Descripción |
---|---|---|
device_code | string | El código de verificación de dispositivo es de 40 caracteres y se utiliza para verificar dicho dispositivo. |
user_code | string | El código de verificación de usuario se muestra en el dispositivo para que el usuario pueda ingresar dicho código en un buscador. El código es de 8 caracteres con un guión medio a la mitad. |
verification_uri | string | URL de verificación en la que los usuarios deben escribir el valor user_code : https://github.com/login/device . |
expires_in | integer | Número de segundos antes de que device_code y user_code expiren. La cantidad predeterminada es de 900 segundos o 15 minutos. |
interval | integer | Número mínimo de segundos que deben pasar antes de poder realizar una nueva solicitud de token de acceso (POST https://github.com/login/oauth/access_token ) para completar la autorización del dispositivo. Por ejemplo, si el intervalo es 5, entonces no puedes hacer una solicitud nueva hasta que hayan transcurrido 5 segudos. Si realiza más de una solicitud en estos 5 segundos, alcanzará el límite de frecuenta y se producirá un error slow_down . |
También puede recibir la respuesta en diferentes formatos si proporciona el formato en el encabezado Accept
. Por ejemplo, Accept: application/json
o Accept: application/xml
:
Accept: application/json
{
"device_code": "3584d83530557fdd1f46af8289938c8ef79f9dc5",
"user_code": "WDJB-MJHT",
"verification_uri": "https://github.com/login/device",
"expires_in": 900,
"interval": 5
}
Accept: application/xml
<OAuth>
<device_code>3584d83530557fdd1f46af8289938c8ef79f9dc5</device_code>
<user_code>WDJB-MJHT</user_code>
<verification_uri>https://github.com/login/device</verification_uri>
<expires_in>900</expires_in>
<interval>5</interval>
</OAuth>
Paso 2: Indicar al usuario ingresar el código de usuario en un buscador
Tu dispositivo mostrará el código de verificación de usuario y pedirá al usuario ingresar el código en la https://github.com/login/device
.
Paso 3: La app sondea GitHub para verificar si el usuario autorizó el dispositivo
POST https://github.com/login/oauth/access_token
La aplicación realizará solicitudes de autorización de dispositivo que sondean POST https://github.com/login/oauth/access_token
hasta que expiren los códigos de usuario y dispositivo, o el usuario haya autorizado correctamente la aplicación con un código de usuario válido. La aplicación debe usar el sondeo interval
mínimo recuperado en el paso 1 para evitar errores de límite de frecuencia. Para más información, consulta Límites de frecuencia para el flujo del dispositivo.
El usuario debe ingresar un código válido dentro de los 15 minutos (o 900 segundos) siguientes. Después de 15 minutos, tendrá que solicitar un nuevo código de autorización de dispositivo con POST https://github.com/login/device/code
.
Ya que el usuario lo haya autorizado, la app recibirá un token de acceso que se puede utilizar para hacer solicitudes a la API en nombre de un usuario.
El punto de conexión toma los siguientes parámetros de entrada.
Nombre de parámetro | Type | Descripción |
---|---|---|
client_id | string | Obligatorio. El id. de cliente que ha recibido de GitHub para la OAuth app. |
device_code | string | Necesario. El device_code que recibió de la solicitud POST https://github.com/login/device/code . |
grant_type | string | Necesario. El tipo de concesión debe ser urn:ietf:params:oauth:grant-type:device_code . |
Predeterminadamente, la respuesta toma la siguiente forma:
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer&scope=repo%2Cgist
También puede recibir la respuesta en diferentes formatos si proporciona el formato en el encabezado Accept
. Por ejemplo, Accept: application/json
o Accept: application/xml
:
Accept: application/json
{
"access_token": "gho_16C7e42F292c6912E7710c838347Ae178B4a",
"token_type": "bearer",
"scope": "repo,gist"
}
Accept: application/xml
<OAuth>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
<token_type>bearer</token_type>
<scope>gist,repo</scope>
</OAuth>
Límites de tasa para el flujo del dispositivo
Cuando un usuario emite el código de verificación en el buscador, hay un límite de tasa de 50 emisiones en una hora por aplicación.
Si realiza más de una solicitud de token de acceso (POST https://github.com/login/oauth/access_token
) dentro del período mínimo necesario entre las solicitudes (o interval
), alcanzará el límite de frecuencia y recibirá una respuesta de error slow_down
. La respuesta de error slow_down
agrega 5 segundos a la última instancia de interval
. Para más información, vea Códigos de error para el flujo del dispositivo.
Códigos de error para el flujo del dispositivo
Código de error | Descripción |
---|---|
authorization_pending | Este error ocurre cuando la solicitud de autorización se encuentra pendiente y el usuario no ha ingresado el código de usuario aún. Se espera que la aplicación siga sondeando la solicitud POST https://github.com/login/oauth/access_token sin superar interval , para lo que se necesita un número mínimo de segundos entre cada solicitud. |
slow_down | Cuando recibe el error slow_down , se agregan 5 segundos adicionales al valor interval mínimo o período de tiempo necesario entre las solicitudes mediante POST https://github.com/login/oauth/access_token . Por ejemplo, si en el intervalo de inicio se necesitaban al menos 5 segundos entre solicitudes y recibe una respuesta de error slow_down , ahora tendrá que esperar al menos 10 segundos antes de poder realizar una nueva solicitud para un token de acceso de OAuth. La respuesta de error incluye el nuevo valor interval que debe usar. |
expired_token | Si el código del dispositivo ha expirado, verá el error token_expired . Debes hacer una nueva solicitud para un código de dispositivo. |
unsupported_grant_type | El tipo de concesión debe ser urn:ietf:params:oauth:grant-type:device_code e incluirse como parámetro de entrada al sondear la solicitud de token de OAuth POST https://github.com/login/oauth/access_token . |
incorrect_client_credentials | Para el flujo de dispositivos, debes pasar la ID de cliente de tu app, la cual puedes encontrar en la página de configuración de la misma. client_secret no es necesario para el flujo del dispositivo. |
incorrect_device_code | El device_code que se proporcionó es inválido. |
access_denied | Cuando un usuario hace clic en Cancelar durante el proceso de autorización, recibirá un error de access_denied y el usuario no podrá volver a utilizar el código de verificación. |
device_flow_disabled | El flujo de dispositivos no se habilitó en los ajustes de la app. Para más información, consulta Flujo de dispositivos. |
Para más información, consulta Concesión de autorización de dispositivos de OAuth 2.0.
Flujo de aplicaciónes no web
La autenticación no web está disponible para situaciones limitadas, como las pruebas. Si lo necesitas, puede usar la autenticación básica para crear un personal access token en la página de configuración de personal access token. Esta técnica le permite al usuario revocar el acceso en cualquier momento.
URL de redireccionamiento
El redirect_uri
es opcional. Si se excluye, GitHub redireccionará a los usuarios a la URL de devolución de llamada configurada en la OAuth app. Si se indican, el puerto y host de la dirección URL de redireccionamiento (subdominios excluidos) deben coincidir exactamente con los de la dirección URL de devolución de llamada. La ruta de la URL de redireccionamiento debe hacer referencia un subdirectorio de la URL de devolución de llamada.
CALLBACK: http://example.com/path
GOOD: http://example.com/path
GOOD: http://example.com/path/subdir/other
GOOD: http://oauth.example.com/path
GOOD: http://oauth.example.com/path/subdir/other
BAD: http://example.com/bar
BAD: http://example.com/
BAD: http://example.com:8080/path
BAD: http://oauth.example.com:8080/path
BAD: http://example.org
Direcciones URL de redireccionamiento de bucle invertido
El parámetro opcional redirect_uri
también se puede usar para las direcciones URL de bucle invertido, lo que resulta útil para las aplicaciones nativas que se ejecutan en un equipo de escritorio. Si la aplicación especifica una dirección URL y un puerto de bucle invertido, los usuarios se redireccionarán al puerto y dirección URL proporcionados después de que la aplicación reciba la autorización. No es necesario que redirect_uri
coincida con el puerto especificado en la dirección URL de devolución de llamada de la aplicación.
Para la dirección URL de devolución de llamada http://127.0.0.1/path
, puede usar esta redirect_uri
si la aplicación está escuchando en el puerto 1234
:
http://127.0.0.1:1234/path
Recuerda que en la especificación RFC de OAuth se recomienda no usar localhost
, sino usar el literal de bucle invertido 127.0.0.1
o la IPv6 ::1
.
Creación de múltiples tokens para OAuth apps
Puedes crear tokens múltiples para una combinación de usuario/aplicación/alcance para crear tokens para casos de uso específicos.
Esto es útil si tu OAuth app es compatible con un flujo de trabajo que utilice GitHub para registrarse y requiera solo información básica del usuario. Otro flujo de trabajo podría requerir acceso a los repositorios privados del usuario. Al utilizar tokens múltiples, tu OAuth app podrá llevar a cabo el flujo web para cada caso de uso, solicitando únicamente los alcances que necesite. Si un usuario utiliza tu aplicación únicamente para registrarse, nunca se les solicitará otorgar acceso a tu OAuth app para sus repositorios privados.
Hay un límite de diez tokens que se emiten por combinación de usuario/aplicación/ámbito y un límite de frecuencia de diez tokens creados por hora. Si una aplicación crea más de diez tokens para el mismo usuario y los mismos alcances, se revocarán los tokens más antiguos con la misma combinación de usuario/aplicación/alcance. Sin embargo, alcanzar el límite de volumen por hora no revocará el token más antiguo. En su lugar, desencadenará una solicitud de nueva autorización en el explorador, y se pedirá al usuario que compruebe los permisos que concede a la aplicación. Este mensaje está pensado interrumpir cualquier bucle infinito posible en el que la aplicación está atrapada, ya que hay pocos o ningún motivo para que una aplicación solicite diez tokens al usuario en un plazo de una hora.
Warning
Si revocas todos los permisos de una OAuth app, se eliminarán todas las claves SSH generadas por la aplicación en nombre del usuario, incluidas las claves de implementación.
Dirigir a los usuarios para revisar su acceso
Puedes vincular a la información de autorización para una OAuth app para que los usuarios puedan revisar y revocar sus autorizaciones de la aplicación.
Para crear este vínculo, necesitarás el client_id
de las OAuth app que has recibido de GitHub al registrar la aplicación.
https://github.com/settings/connections/applications/:client_id
Tip
Para obtener más información sobre los recursos de un usuario a los que puede acceder la OAuth app, consulta Descubrir los recursos para un usuario.
Solución de problemas
- Solución de problemas para los errores de solicitud de autorización
- Solución de errores de solicitud de tokens de acceso de aplicaciones de OAuth
- Errores de flujo de dispositivo
- Vencimiento y revocación de tokens