====== API ====== Interfaz de programación de aplicaciones (//Application Programming Interface//). Es un conjunto de rutinas que provee acceso a funciones de un determinado software. Son utilizadas por los programadores para construir sus aplicaciones sin necesidad de volver a programar funciones ya hechas por otros, reutilizando código que se sabe que está probado y que funciona correctamente. ===== Acceso ===== ==== OAuth ==== La especificación de OAuth 2.0 se puede encontrar en el [[https://datatracker.ietf.org/doc/html/rfc6749|RFC 6749]] Acceso limitado a ciertos recursos mediante autorización. OAuth viene de **Open Authorization**, es decir, dar a "otros" autorización para acceder de forma **limitada** a ciertos recursos. En resumen: * OAuth permite acceso a terceros/otros (clientes o aplicaciones) * Provee acceso limitado (autorizado) * Acceso a un servicio web (vía HTTP) * OAuth 1.0 está obsoleto Dado que hay riesgo en dar credenciales a terceros, OAuth emplea un **token de acceso**. Este token es el usado para obtener acceso a los recursos protegidos. Roles: * **Resource Owner**: propietario del recurso al que se quiere acceder. * **Resource Server**: provee los recursos * **Cliente** / **Aplicación** (//third party//): quien accede a los recursos * **Authorization Server**: provee el token de acceso al cliente/aplicación para acceder a los recursos. Flujo del protocolo OAuth: - El cliente hace una petición de autorización al Resource Owner - El Resource Owner responde con una permiso de acceso (//Authorization Grant//) al cliente indicándole que tiene autorización para acceder a los recursos. - El cliente envía el permiso obtenido al Authorization Server que es responsable de proteger los recursos del Resource Owner - El Authorization Server envía al cliente el token de acceso. - El cliente usa el token de acceso con el Resource Server para obtener los recursos protegidos. - El Resource Server envía los recursos solicitados por el cliente y a los que tiene autorización. +--------+ +---------------+ | |--(A)- Authorization Request ->| Resource | | | | Owner | | |<-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant -->| Authorization | | Client | | Server | | |<-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------>| Resource | | | | Server | | |<-(F)--- Protected Resource ---| | +--------+ +---------------+ Tipos de autorizaciones (//authorization grant types//): * **Authorization code**: el cliente pide autorización al propietario del recursos a través del Authorization Server. El propietario del recursos tiene que acceder al Authorization Server para darle permisos. * **Implicit**: los recursos de solicitan a través de un programa. * **Resource Owner**: permisos totales sobre los recursos. * **Client credencials**: nunca se le pregunta al propietario del recursos por permiso. El más utilizado es el de **Authorization Code**. Un **token de acceso** (//access token//) se usa para poder acceder a un recurso protegido. El **refresh token** es lo que se utiliza para conseguir un nuevo token de acceso. Se utiliza cuando el token de acceso tiene un tiempo de vida limitado. === Authorization Code Grant === Antes de comenzar el flujo del protocolo, el cliente debe haber conseguir del Authentication Server un **Client ID**. El cliente / aplicación hace una petición HTTP al //endpoint// de su interés, envía su ID y autenticación al Authorization Server para obtener el código de autorización. El cliente envía el código de autorización al Authorization Server y este le devuelve el **access token**. === Registro de clientes === El cliente hace una solicitud HTTP al Authorization Server y este le devuelve: * Client ID * Client Secret (cuando el tipo de cliente es confidencial) ===== APIs públicas ===== * [[https://github.com/public-apis/public-apis|Colección de APIs públicas]] (GitHub)