3.20.9. Elemento <openidconnect>
3.20.9.1. Descripción del elemento
Este elemento describe la configuración relacionada con la autenticación de OpenID Connect. Aplicable cuando se utiliza el cliente ligero, cliente móvil y cliente web. El elemento <openidconnect> está subordinado al elemento <point> y puede ser uno o ninguno. Subordinados al elemento <openidconnect> están los elementos <providers> y <allowStandardAuthentication>. Los elementos subordinados pueden ser singulares o estar ausentes.
Este elemento no contiene atributos.
<openidconnect> <providers><![CDATA[[ <json-data> ]]]> </providers> <allowStandardAuthentication>true</allowStandardAuthentication> <openidconnect>
3.20.9.2. Elemento <providers>
Este elemento contiene una descripción de los proveedores de OpenID externos que admiten el protocolo de autorización OpenID Connect v1.0 (https://openid.net/connect/). La descripción es una matriz de objetos, cada uno de los cuales describe un proveedor de OpenID. La matriz se representa como una serialización JSON.
Cada proveedor se describe mediante un objeto con los siguientes atributos:
- name - identificador del proveedor. Debe ser único dentro de la matriz. Si hay varios proveedores con el mismo identificador dentro de la matriz, se utilizará el último de la matriz.
- title - representación textual del proveedor. Se mostrará en el botón del proveedor en la página de autenticación si no se especifica una imagen (image).
- image - representación gráfica del proveedor. Se mostrará en el botón del proveedor en la página de autenticación. La imagen se especifica como data:image en formato Base64.
- discovery - contiene la URL del proveedor, al acceder a través de la cual se puede obtener toda su configuración (discovery endpoint URL). Se recomienda utilizar proveedores que admitan discovery endpoint.
- authenticationClaimName - define qué campo de la estructura JSON (JSON Web Token, JWT) con los resultados de autenticación se debe usar como identificador para comparar el usuario de la base de información y el usuario del proveedor de OpenID Connect. Si no se especifica se utiliza el campo de correo electrónico.
- authenticationUserPropertyName - determina qué campo en la configuración de usuario de la base de información se usa para comparar con el identificador de usuario, que pasa el proveedor de OpenID Connect. Se permite especificar los siguientes valores:
- name - nombre de usuario (atributo Name del objeto InfoBaseUser).
- OSUser - nombre del usuario del sistema operativo (atributo OSUser del objeto InfoBaseUser).
- email - dirección de correo electrónico del usuario de la base de información (atributo Email del objeto InfoBaseUser).
- matchingKey - en este caso, el valor del atributo UserMatchingKeys se usa como campo y el valor del atributo name de la descripción del proveedor se usa como clave de búsqueda.
- endSessionEndpoint - especifica la URL a la que se navegará cuando se ejecute el comando para finalizar la sesión de autenticación. A esta URL se añadirá automáticamente el parámetro id_token_hint, en el que se colocará el token recibido durante la autenticación del usuario. Cerrar una pestaña del navegador web con una aplicación de cliente web en ejecución, así como cerrar la aplicación de cliente, no finaliza la sesión de autenticación. Cuando se trabaja en el cliente web, una vez completada la sesión de autenticación, será redirigido a la página de finalización de sesión estándar.
- provideconfig - descripción del ajuste del proveedor en forma de estructura JSON (si el proveedor no admite la solicitud para obtener el ajuste). Los datos deben estar en formato OpenID Provider Metadata (https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).
- clientconfig - configuración del cliente en forma de estructura JSON. El formato de esta información corresponde al formato OAuth 2.0 Authorization Request (https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest), a la que se le añade el atributo authority, que debe contener el URL del proveedor de autenticación. El contenido de este atributo depende del proveedor que se utilice.
En dependencia del tipo de autenticación requerida, el valor del atributo response_type toma los siguientes valores:
- code - se emplea Authorization Code Flow. En este caso, el atributo client_secret de la estructura clientconfig contiene la información que el proveedor de OpenID proporciona al usuario al registrarse. Este atributo se elimina de la estructura clientconfig cuando se envía a la aplicación de cliente.
- id_token o id_token token - es utilizado por Implicit Flow. En este caso, el atributo client_secret de la estructura clientconfig no se utiliza. Implicit Code Flow no se recomienda por razones de seguridad. Se utiliza por compatibilidad.
- No se admiten otras combinaciones.
El atributo redirect_uri de la estructura clientconfig contiene la URL que redirige hacia el controlador de autenticación de la aplicación que solicita la autenticación. Por lo general, esta URL se verá así: https://IBhost/IBname/authform.html, donde:
- IBhost - nombre de host en el que se publica la base de información.
- IBname - nombre de la base de información publicada (por "nombre" se entiende el contenido del campo Name del cuadro de diálogo de la publicación de la base de información o un valor similar durante otro método de publicación).
- dialect - define el protocolo que se utilizará para comunicarse con el proveedor. Si se especifica el valor ru-esia, se utilizará el protocolo del Sistema Unificado de Identificación y Autenticación (ESIA, https://minsvyaz.ru/ru/activity/directions/13/). Si no se especifica este atributo o su valor difiere de ru-esia, se utilizará el protocolo OpenID Connect v1.0 para interactuar con el proveedor.
- crypto - contiene una estructura que describe el módulo de criptografía que se utiliza para firmar solicitudes. Es necesario firmar las solicitudes enviadas si se utiliza el protocolo ESIA para comunicarse con el proveedor (atributo dialect igual al valor ru-esia). La estructura contiene los siguientes atributos:
- module_name - nombre del módulo de criptografía;
- module_path - ruta al módulo de criptografía;
- module_type - tipo de módulo de criptografía;
- cert_thumbprint - huella digital del certificado que se usará para firmar las solicitudes. La huella digital buscará el certificado. El certificado debe colocarse primero en el repositorio de certificados personales.
Los campos de estructura ubicados en el atributo crypto son similares a los parámetros del diseñador del objeto CryptoManager.
Ejemplo de especificación de proveedores:
<openidconnect> <providers> <![CDATA[[ { "name": "google", "title": "Google", "discovery": "https://accounts.google.com/.well-known/openid-configuration", "authenticationClaimName": "email", "clientconfig": { "authority": "https://accounts.google.com/", "client_id": "<identificador de cliente>", "redirect_uri": "https://<hostname>/openidc/authform.html", "response_type": "id_token token", "scope": "openid email", "filterProtocolClaims": true, "loadUserInfo": false } }, { "name": "googleII", "title": "Google 2", "providerconfig": { "issuer": "https://accounts.google.com", "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth", "token_endpoint": "https://www.googleapis.com/oauth2/v4/token", "response_types_supported": ["code","token"], "scopes_supported": ["openid","email","profile"] }, "clientconfig": { "authority": "https://accounts.google.com/", "client_id": "<identificador de cliente>", "redirect_uri": "https://<hostname>/openidc/authform.html", "response_type": "id_token token", "scope": "openid email" } }, { "name": "googleIII", "title": "Google 3", "providerconfig": { "issuer": "https://accounts.google.com", "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth", "token_endpoint": "https://www.googleapis.com/oauth2/v4/token", "response_types_supported": ["code","token"], "scopes_supported": ["openid","email","profile"] }, "clientconfig": { "authority": "https://accounts.google.com/", "client_id": "<identificador de cliente>", "client_secret": "<client secret>", "redirect_uri": "https://<hostname>/openidc/authform.html", "response_type": "code", "scope": "openid email" } }, { "name": "microsoft", "title": "Microsoft", "authenticationUserPropertyName" : "OSUser", "image": "data:image/png;base64,………", "discovery": "https://login.microsoftonline.com/<identificador de cliente>/.well-known/openid-configuration", "clientconfig": { "authority": "https://login.microsoftonline.com/<identificador de cliente>/", "client_id": "<identificador de cliente>", "redirect_uri": "https://<hostname>/openidc/authform.html", "response_type": "id_token token", "scope": "openid email" } }, { "name": "googleIV", "title": "GOOGLE.COM", "discovery": "https://accounts.google.com/.well-known/openid-configuration", "authenticationClaimName": "email", "authenticationUserPropertyName": "matchingKey", "clientconfig": { "authority": "https://accounts.google.com", "client_id": "<identificador de cliente>", "client_secret": "<client secret>", "redirect_uri": "https://<hostname>/openidc/authform.html", "response_type": "token id_token", "scope": "openid email", "filterProtocolClaims": true, "loadUserInfo": false } }, { "name": "esia", "title": "ESIA", "authenticationClaimName": "value", "authenticationUserPropertyName": "name", "dialect": "ru-esia", "crypto": { "module_path": "", "module_name": "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "module_type": "80", "cert_thumbprint": "<huella digital del certificado>" }, "providerconfig": { "authorization_endpoint": "https://<hostname>/aas/oauth2/ac", "token_endpoint": "https://<hostname>/aas/oauth2/te", "userinfo_endpoint": "https://<hostname>/rs/prns/" }, "clientconfig": { "authority": "https://<hostname>/aas/oauth2/ac", "client_id": "<identificador de cliente>", "redirect_uri": "https://<hostname>/openidc/authform.html", "scope": "openid email", "response_type": "code", "access_type": "offline" } } ]]]> </providers> <allowStandardAuthentication>true</allowStandardAuthentication> </openidconnect>
El ejemplo del proveedor de googleIV demuestra cómo se debe especificar un campo de la colección UserMatchingKeys. En este ejemplo:
- El campo del token que contiene el identificador del usuario para la coincidencia es el campo email. Esto se especifica en la expresión authenticationClaimName": "email".
- La expresión "authenticationUserPropertyName": "matchingKey" indica que el sistema debe "examinar" a todos los usuarios de la base de información, obtener de cada usuario la estructura UserMatchingKeys, y en esta estructura obtener la campo con el identificador, especificado en el campo name de la descripción del proveedor. En nuestro ejemplo es el valor de googleIV. El valor recibido por esta clave del usuario se comparará con el valor del campo email del token.
3.20.9.3. Elemento <allowStandardAuthentication>
El elemento indica la posibilidad de utilizar la autenticación "1C:Enterprise". Si este elemento está establecido en false, en el formulario de autenticación (al intentar iniciar sesión al cliente ligero y al cliente web), la autenticación estará disponible solo con la ayuda de los proveedores descritos en el archivo default.vrd.
El elemento puede tomar los siguientes valores:
- true - se permite la autenticación "1C:Enterprise". Valor predeterminado.
- false - la autenticación "1C:Enterprise" está prohibida.
3.20.9.4. Escenario de trabajo
La autenticación con el proveedor de OpenID Connect solo está disponible si los parámetros de uno o más proveedores se especifican en el archivo default.vrd. Al intentar utilizar una aplicación de cliente (cliente ligero, cliente móvil o cliente web) para acceder a una base de información, se realizan las siguientes acciones:
- Si se especifica explícitamente un proveedor en la línea de comando de la aplicación de cliente, la transición se realiza de acuerdo con los parámetros especificados en el archivo default.vrd para este proveedor.
- De lo contrario, la plataforma genera un formulario de lanzamiento (en dependencia de la aplicación de cliente) que aloja todos los proveedores de OpenID Connect configurados (en el archivo default.vrd). En dependencia de la configuración, esta página puede contener un botón de acceso que utiliza la autenticación estándar "1C:Enterprise".
- Después de seleccionar un proveedor, el usuario es redirigido a la página de autenticación del proveedor seleccionado. En esta página, el usuario se autentica con el proveedor seleccionado de cualquier forma disponible (para este proveedor).
- Luego, el proveedor redirige al usuario a una página especial del sistema "1C:Enterprise", pasando como "parámetro" una estructura JSON (JSON Web Token, JWT) con los resultados de la autenticación. La dirección de esta página se especifica en el atributo redirect_uri de la estructura clientconfig del elemento provider.
- Usando los resultados de autenticación enviados por el proveedor, la plataforma recibe del proveedor un parámetro clave para identificar al usuario. De forma predeterminada, este parámetro es la dirección de correo electrónico del usuario, pero con la ayuda del archivo default.vrd el parámetro puede ser anulado (campo authenticationClaimName).
- El parámetro clave resultante se utiliza para buscar un usuario en la base de información de "1C:Enterprise". De forma predeterminada, se usa el atributo Nombre. El campo de búsqueda se puede anular mediante el archivo default.vrd (field authenticationUserPropertyName).
- Después de eso, la autenticación se considera exitosa y la aplicación continúa ejecutándose.
Si falla la autenticación con el proveedor, las acciones del proveedor no están definidas.