Autenticación (Proveedor)
Terminología
Para una mayor comprensión de los protocolos, véase:
Especificación del protocolo OAuth 2.0.
Especificación del protocolo OpenId Connect.
La siguiente terminología es usada en el resto del documento y busca ser compatible con la terminología utilizada en OpenId Connect.
Roles
-
Propietario del recurso (Resource Owner)
Es el ciudadano que tiene acceso a un navegador web y es capaz de dar acceso a sus recursos protegidos. Se puede utilizar el término usuario, ciudadano o End-User. -
Cliente (Client)
Es el Sistema Cliente que hace peticiones a recursos protegidos en nombre del propietario del recurso y con la autorización del mismo. También se pueden utilizar los términos: sistema cliente, aplicación cliente para hacer referencia a este concepto. -
Proveedor de Identidad (Identity Provider)
Es el Sistema Proveedor de Identidad que es el responsable de validar las credenciales del ciudadano (Authorization endpoint) y generar tokens de acceso (Token endpoint). Se utilizan los términos servidor de autenticación de Ciudadanía Digital, Provider, Servidor de Autorización (en terminología referente a OAuth 2.0) -
Recurso protegido (Protected Resource)
Son los recursos que tiene acceso el Resource Owner tras obtener un token de acceso.
Tokens
-
ID token
Un ID token es un JSON Web Token (JWT) que contiene información sobre el proceso de autenticación del End-User en el servidor de autenticación. -
Access token
Los Access tokens son credenciales emitidas por el servidor de autenticación para un sistema cliente, y tienen como fin permitir a estos últimos el acceso a recursos protegidos. Un Access Token es un string opaco que representa el acceso a ciertos datos y puede ser utilizado por un tiempo limitado. -
Refresh token
Los Refresh tokens son credenciales emitidas por el servidor de autenticación para un sistema cliente, y tienen como fin la obtención de nuevos Access tokens, cuando estos expiran o se vuelven inválidos.
Scopes
Indican los recursos que el cliente quiere acceder a nombre del usuario, pueden entenderse como permisos que el usuario final autorizará para que una determinada aplicación cliente pueda realizar operaciones.
Estos scopes o permisos pueden ser públicos (public), privados (private) o internos (internal).
Los scopes tipificados como públicos son aquellos que pueden ser implementados por instituciones del Estado, ajenas a los detalles de implementación del ecosistema de Ciudadanía Digital, los scopes privados e internos están destinados a ser parte de la implementación interna del ecosistema de Ciudadanía Digital.
Se listan a continuación los scopes públicos:
| Nombre | Descripción | Tipo | Observación |
|---|---|---|---|
| profile | Permiso para acceder al Perfil público del usuario (nro_documento, nombre completo) | público | |
| fecha_nacimiento | Permiso para acceder a la fecha de nacimiento del usuario. Pedirlo sólo si se hará uso de ella dentro del sistema cliente. | público | |
| Permiso para acceder a la dirección de correo electrónica del usuario. Pedirlo sólo si se hará uso de él dentro del sistema cliente. | público | ||
| celular | Permiso para acceder al número de celular del usuario. Pedirlo sólo si se hará uso de él dentro del sistema cliente. | público | |
| openid | Permiso para acceder a la información de la autenticación del usuario | público | |
| offline_access | Permiso para acceder a refresh token | público | |
| nombre | Permiso para acceder al nombre completo del usuario | público | deprecated |
| documento_identidad | Permiso para acceder al número de documento de identidad del usuario | público | deprecated |
Discovery
Acorde a la especificación de OpenID Connect, el mecanismo de autenticación expone un endpoint para descubrir la configuración del proveedor de identidad. La configuración se encuentra en notación de objetos Javascript, JSON.
La configuración se encuentra en:
https://<base-url-proveedor-identidad>/.well-known/openid-configuration
La respuesta tendrá un aspecto similar al siguiente:
{
"authorization_endpoint": "https://<base-url-proveedor-identidad>/auth",
"device_authorization_endpoint": "https://<base-url-proveedor-identidad>/device/auth",
"claims_parameter_supported": true,
"claims_supported": [
"sub",
"profile",
"fecha_nacimiento",
"email",
"celular",
"documento_identidad",
"numero_documento",
"tipo_documento",
"nombre",
"nombres",
"primer_apellido",
"segundo_apellido",
"sid",
"auth_time",
"iss",
"amr"
],
"code_challenge_methods_supported": ["plain", "S256"],
"end_session_endpoint": "https://<base-url-proveedor-identidad>/session/end",
"grant_types_supported": [
"authorization_code",
"refresh_token",
"client_credentials",
"urn:ietf:params:oauth:grant-type:device_code",
"urn:ietf:params:oauth:grant-type:token-exchange"
],
"id_token_signing_alg_values_supported": ["PS256", "RS256", "ES256"],
"issuer": "https://<base-url-proveedor-identidad>",
"jwks_uri": "https://<base-url-proveedor-identidad>/certs",
"registration_endpoint": "https://<base-url-proveedor-identidad>/reg",
"authorization_response_iss_parameter_supported": true,
"response_modes_supported": [
"form_post",
"fragment",
"query",
"web_message",
"jwt",
"query.jwt",
"fragment.jwt",
"form_post.jwt",
"web_message.jwt"
],
"response_types_supported": ["code"],
"scopes_supported": [
"openid",
"profile",
"fecha_nacimiento",
"email",
"celular",
"offline_access",
"me.devices.create",
"me.devices.delete",
"me.sessions.read",
"nonce.create",
"nonce.read",
"documento_identidad",
"nombre"
],
"subject_types_supported": ["public", "pairwise"],
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"none"
],
"token_endpoint": "https://<base-url-proveedor-identidad>/token",
"request_object_signing_alg_values_supported": [
"HS256",
"RS256",
"PS256",
"ES256",
"EdDSA"
],
"request_parameter_supported": false,
"request_uri_parameter_supported": true,
"require_request_uri_registration": true,
"userinfo_endpoint": "https://<base-url-proveedor-identidad>/me",
"authorization_signing_alg_values_supported": ["PS256", "RS256", "ES256"],
"introspection_endpoint": "https://<base-url-proveedor-identidad>/token/introspection",
"introspection_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"none"
],
"introspection_signing_alg_values_supported": ["PS256", "RS256", "ES256"],
"revocation_endpoint": "https://<base-url-proveedor-identidad>/token/revocation",
"revocation_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"none"
],
"id_token_encryption_alg_values_supported": [
"A128KW",
"A256KW",
"ECDH-ES",
"RSA-OAEP",
"dir"
],
"id_token_encryption_enc_values_supported": [
"A128CBC-HS256",
"A128GCM",
"A256CBC-HS512",
"A256GCM"
],
"introspection_encryption_alg_values_supported": [
"A128KW",
"A256KW",
"ECDH-ES",
"RSA-OAEP",
"dir"
],
"introspection_encryption_enc_values_supported": [
"A128CBC-HS256",
"A128GCM",
"A256CBC-HS512",
"A256GCM"
],
"authorization_encryption_alg_values_supported": [
"A128KW",
"A256KW",
"ECDH-ES",
"RSA-OAEP",
"dir"
],
"authorization_encryption_enc_values_supported": [
"A128CBC-HS256",
"A128GCM",
"A256CBC-HS512",
"A256GCM"
],
"request_object_encryption_alg_values_supported": ["A128KW", "A256KW", "dir"],
"request_object_encryption_enc_values_supported": [
"A128CBC-HS256",
"A128GCM",
"A256CBC-HS512",
"A256GCM"
],
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true,
"claim_types_supported": ["normal"]
}