Compartir a través de


Desarrollo de extensiones para proyectos públicos

Azure DevOps Services

Azure DevOps Services admite proyectos públicos y privados. Los proyectos privados restringen el acceso a los usuarios autenticados con permisos explícitos. Los proyectos públicos permiten a los usuarios que no son miembros ver el contenido del proyecto en un estado de solo lectura.

Un usuario que no sea miembro puede ser:

  • Anónimo: no autenticado en Azure DevOps Services
  • Público: autenticado a Azure DevOps Services pero no es miembro de la organización

Los usuarios que no son miembros ven las mismas vistas que los usuarios autenticados, pero Azure DevOps oculta o deshabilita la funcionalidad no pública, como la configuración, las acciones y las operaciones de cola de compilación.

Importante

Solo las organizaciones con la directiva Permitir proyecto público ya habilitada pueden crear proyectos o cambiar la visibilidad de un proyecto a público. La directiva ya no está disponible para las organizaciones que aún no lo usan. Microsoft recomienda usar GitHub para todas las necesidades del proyecto público.

Decidir si una extensión es visible para los usuarios que no son miembros

Como desarrollador de extensiones, puede hacer que toda o parte de la extensión esté disponible para los usuarios que no son miembros. Estos usuarios solo pueden usar la extensión desde proyectos públicos. Si decide no poner la extensión a disposición de los usuarios que no son miembros, no necesita cambios y la decisión no afecta a los miembros que usan la extensión en proyectos públicos.

Use esta lista de comprobación para ayudar a decidir si debe poner la extensión a disposición de los usuarios que no son miembros:

  • La extensión presenta datos relevantes para los usuarios que no son miembros
  • La extensión contribuye a las funcionalidades en el nivel de proyecto
  • La extensión contribuye a las áreas de producto a las que los usuarios que no son miembros pueden acceder
  • La extensión no amplía ni depende de características a las que los usuarios que no son miembros no pueden acceder, como el servicio de datos de extensión o ciertas API REST de servicios de Azure DevOps. Para obtener más información, consulte la sección Limitaciones .

Configuración de la visibilidad de la contribución

De forma predeterminada, Azure DevOps muestra contribuciones solo a los miembros de la organización. Para proporcionar visibilidad a los usuarios que no son miembros de una contribución, establezca el restrictedTo atributo en esa contribución. El valor es una matriz de cadenas que muestra qué tipos de usuario deben ver la contribución. Entre los valores posibles se incluyen:

  • member: un usuario autenticado que es miembro de la organización.
  • public: un usuario autenticado que no es miembro de la organización.
  • anonymous: un usuario no autenticado

Hacer que un centro sea visible para usuarios anónimos, públicos y miembros

{
    "contributions": [
        {
            "id": "my-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-code-web.code-hub-group"
            ],
            "restrictedTo": [
                "member",
                "public",
                "anonymous"
            ],
            "properties": {
                ...            
            }
        }
    ]
}

También puede establecer la visibilidad predeterminada de todas las contribuciones de la extensión estableciendo el restrictedTo atributo en la raíz del manifiesto de extensión. Entonces, puede anular este valor predeterminado en las contribuciones individuales.

Hacer que todas las contribuciones, excepto para una, sean visibles para todos los usuarios

{
    "id:": "my-extension",
    "name": "My Extension",
    "version": "1.0.0",
    ...
    "restrictedTo": [
           "anonymous",
           "public",
           "member"
    ],
    "contributions": [
        {
            "id": "my-member-only-widget",
            "type": "ms.vss-dashboards-web.widget",
            "restrictedTo": [
                "member"
            ],
            "properties": {
                ...
            }
        },
        {
            "id": "my-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-code-web.code-hub-group"
            ],
            "properties": {  
                ...              
            }
        },
        {
            "id": "my-second-hub",
            "type": "ms.vss-web.hub",
            "targets": [
                "ms.vss-work-web.work-hub-group"
            ],
            "properties": {  
                ...              
            }
        }            
    ]
}

Descripción de las limitaciones de los usuarios que no son miembros

Si desea que algunos o todos los aspectos de su contribución estén disponibles para los usuarios públicos, tenga en cuenta las siguientes limitaciones.

Restricciones de métodos del SDK de VSS

El script principal del SDK, VSS.SDK.js, permite a las extensiones web comunicarse con el marco primario para realizar operaciones como inicializar la comunicación y obtener información actual del contexto del usuario. Los siguientes métodos del SDK de VSS no admiten usuarios que no son miembros:

  • VSS.getAccessToken()
  • VSS.getAppToken()

Limitaciones del servicio de datos de extensión

Dado que el servicio de datos de extensión administra los datos que no tienen ámbito ni están protegidos en un proyecto, los usuarios que no son miembros no pueden leer ni escribir ningún tipo de datos de extensión.

Control de errores de acceso a datos

Cuando el servicio de datos no puede acceder a los datos debido a limitaciones de permisos por parte del usuario que realiza la llamada, la promesa devuelta de la llamada a getValue se rechaza. El error pasado a la función reject tiene una propiedad name, lo que ayuda a entender por qué la llamada no pudo leer o escribir datos.

VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
    dataService.getValue("someKey").then(function(value) {
         // Process the value
    }, function(error) {
       if (error.name === "AccessCheckException") {
           alert(error.message);
       }
    });
});

Acceso a la API REST

Azure DevOps Services proporciona un conjunto limitado de API REST a usuarios que no son miembros. Estas API incluyen la mayoría de las API de nivel de organización y de nivel de proyecto para las características a las que los usuarios que no son miembros pueden acceder con carácter general. Tenga en cuenta esta información cuando decida si quiere que la extensión esté disponible para los usuarios que no son miembros.

Se recomienda usar la versión 5.0 y las API posteriores, ya que Azure DevOps hace que ciertas API estén disponibles para los usuarios que no son miembros solo a partir de la versión 5.0.

Referencias de identidad

La mayoría de las API REST de Azure DevOps Services usan un "contrato" común para representar un usuario o grupo. Para proteger la información de los miembros, como las direcciones de correo electrónico, Azure DevOps omite determinados campos, como uniqueName, cuando un usuario anónimo o público invoca una API REST.

Compruebe los permisos de usuario

Use permisos para decidir si desea exponer o habilitar una funcionalidad en la extensión. Utiliza la API REST de seguridad en el código de extensión web para comprobar si el usuario actual tiene permiso en Azure DevOps Services para que pueda completar la tarea. Este enfoque impide que los usuarios piensen que tienen permiso para hacer algo, solo para descubrir que no lo hacen.

Compruebe si el usuario tiene permiso para poner en cola compilaciones

En este ejemplo se muestra cómo usar el cliente REST de seguridad para comprobar si el usuario tiene permisos para poner en cola compilaciones en el proyecto actual. De forma predeterminada, los usuarios que no son miembros no tienen este permiso.

VSS.require(["VSS/Service", "VSS/security/RestClient"], function(VSS_Service, Security_RestClient) {
   var client = VSS_Service.getCollectionClient(Security_RestClient.SecurityHttpClient3);
 
   var securityToken = VSS.getWebContext().project.id;
 
   client.hasPermissionsBatch({
    evaluations: [
       {
           "securityNamespaceId": "33344D9C-FC72-4d6f-ABA5-FA317101A7E9",
           "token": securityToken,
           "permissions": 128 /* queue builds */
       }
    ],
    alwaysAllowAdministrators: true
}
).then(function(response) {
     console.log("Can user queue builds in this project? " + response.evaluations[0].value);
  });
});

Tener en cuenta los requisitos del widget del panel

Al igual que otros tipos de contribuciones, la restrictedTo propiedad de contribución controla la visibilidad de las contribuciones del widget de panel. Por ejemplo, para que un widget sea visible para los usuarios que no son miembros y miembros:

{
  "contributions": [
    {
      "id": "HelloWorldWidget",
      "type": "ms.vss-dashboards-web.widget",
      "targets": [
        "ms.vss-dashboards-web.widget-catalog"
      ],
      "restrictedTo": [
        "member",
        "public",
        "anonymous"
      ],
      "properties": {
          ...
      }
    }
  ]
}

Configuración de las opciones del widget

Al controlar la visibilidad del widget para los usuarios que no son miembros, el marco del panel también proporciona un mecanismo de almacenamiento opcional de formulario abierto para la configuración del widget. Dos mecanismos indican si la configuración del widget está disponible para los usuarios que no son miembros en proyectos públicos.

Un widget con opciones configurables que sean visibles para los usuarios que no son miembros debe seguir uno de los siguientes patrones. No seguir estos patrones impide que el widget aparezca para estos usuarios.

Patrón 1: El widget declara que sus instancias solo almacenan la configuración específica del proyecto.

Establezca la propiedad canStoreCrossProjectSettings de contribución del widget en false, lo que indica que la configuración del widget es específica del proyecto.

{
    "id:": "HelloWorldWidget",
    "type": "ms.vss-dashboards-web.widget",
    ...
    "properties": {
        "canStoreCrossProjectSettings": false
    }
}

Patrón 2: Una instancia de widget declara que su configuración es específica del proyecto

Las instancias de widget individuales también pueden indicar que su configuración es específica del proyecto y está disponible para los usuarios que no son miembros. Al guardar la configuración, el widget debe asignar false a hasCrossProjectSettings en la cadena JSON convertida en texto:

{
    "hasCrossProjectSettings": false,
    "hypotheticalWidgetOption": true,
    "backlogLevel": "Stories"
}

Considerar los requisitos de compilación y versión

Si la extensión contribuye a una tarea de compilación o versión, no necesita cambios para usar esa tarea desde una canalización en un proyecto público.

Manejo de las consideraciones de seguimiento de elementos de trabajo

Las extensiones no funcionan para los usuarios que no son miembros en el contexto de un proyecto público sin cambios. Esto incluye el formulario de elemento de trabajo, otras experiencias de elementos de trabajo y la interacción con las API REST de seguimiento de elementos de trabajo.

Limitaciones del formulario de elemento de trabajo

Azure DevOps produce un error en todas las actualizaciones o eliminaciones de elementos de trabajo para usuarios que no son miembros.

Control de identidades

En la API REST de Azure DevOps Services versión 5.0 y posteriores, el servicio devuelve identidades como IdentityRef objetos en lugar de cadenas. Como se ha descrito anteriormente, Azure DevOps no devuelve determinados campos, como uniqueName, en estos objetos si un usuario que no es miembro realiza la llamada API.

Restricciones de ámbito de API

Las extensiones solo pueden invocar API REST con ámbito de proyecto cuando el usuario actual no es miembro de la organización. Azure DevOps rechaza las llamadas API REST que no están en el ámbito de un proyecto.

Limitaciones de las consultas

Los usuarios que no son miembros se enfrentan a las siguientes limitaciones relacionadas con las consultas de elementos de trabajo:

  • Los usuarios que no son miembros solo pueden ejecutar consultas conocidas por identificador o ruta de acceso
  • Las consultas deben tener como ámbito el proyecto actual. Azure DevOps excluye los elementos de trabajo que no pertenecen al proyecto actual.
  • Los usuarios que no son miembros no pueden crear nuevas consultas ni ejecutar consultas WIQL