Descripción
Usa la API de chrome.permissions
para solicitar permisos opcionales declarados en el tiempo de ejecución en lugar de en el tiempo de instalación, de modo que los usuarios comprendan por qué se necesitan los permisos y otorguen solo los que sean necesarios.
Descripción general
Las advertencias de permisos existen para describir las capacidades que otorga una API, pero algunas de estas advertencias pueden no ser evidentes. La API de Permissions permite a los desarrolladores explicar las advertencias de permisos y presentar nuevas funciones de forma gradual, lo que brinda a los usuarios una introducción a la extensión sin riesgos. De esta manera, los usuarios pueden especificar cuánto acceso desean otorgar y qué funciones quieren habilitar.
Por ejemplo, la funcionalidad principal de la extensión de permisos opcionales es anular la página Nueva pestaña. Una función muestra el objetivo del usuario para el día. Esta función solo requiere el permiso de almacenamiento, que no incluye una advertencia. La extensión tiene una función adicional que los usuarios pueden habilitar haciendo clic en el siguiente botón:
Para mostrar los sitios principales del usuario, se requiere el permiso topSites, que tiene la siguiente advertencia.
Implementa permisos opcionales
Paso 1: Decide qué permisos son obligatorios y cuáles son opcionales
Una extensión puede declarar permisos obligatorios y opcionales. En general, debes hacer lo siguiente:
- Usa los permisos obligatorios cuando sean necesarios para la funcionalidad básica de tu extensión.
- Usa permisos opcionales cuando sean necesarios para las funciones opcionales de tu extensión.
Ventajas de los permisos obligatorios:
- Menos mensajes: Una extensión puede solicitarle al usuario que acepte todos los permisos una sola vez.
- Desarrollo más simple: Se garantiza que los permisos requeridos estén presentes.
Ventajas de los permisos opcionales:
- Mayor seguridad: Las extensiones se ejecutan con menos permisos, ya que los usuarios solo habilitan los permisos que necesitan.
- Mejor información para los usuarios: Una extensión puede explicar por qué necesita un permiso en particular cuando el usuario habilita la función correspondiente.
- Actualizaciones más sencillas: Cuando actualices tu extensión, Chrome no la inhabilitará para tus usuarios si la actualización agrega permisos opcionales en lugar de obligatorios.
Paso 2: Declara permisos opcionales en el manifiesto
Declara permisos opcionales en tu manifiesto de extensión con la clave optional_permissions
, con el mismo formato que el campo permissions:
{
"name": "My extension",
...
"optional_permissions": ["tabs"],
"optional_host_permissions": ["https://www.google.com/"],
...
}
Si deseas solicitar hosts que solo descubres en el tiempo de ejecución, incluye "https://*/*"
en el campo optional_host_permissions
de tu extensión. Esto te permite especificar cualquier origen en Permissions.origins, siempre y cuando tenga un esquema coincidente.
Permisos que no se pueden especificar como opcionales
La mayoría de los permisos de las extensiones de Chrome se pueden especificar como opcionales, con las siguientes excepciones.
Permiso | Descripción |
---|---|
"debugger" |
La API de chrome.debugger sirve como un transporte alternativo para el protocolo de depuración remota de Chrome. |
"declarativeNetRequest" |
Otorga a la extensión acceso a la API de chrome.declarativeNetRequest. |
"devtools" |
Permite que la extensión expanda la funcionalidad de Chrome DevTools. |
"experimental" |
Canary y canal para desarrolladores solamente. Otorga acceso a las APIs de chrome.experimental. |
"geolocation" |
Permite que la extensión use la API de ubicación geográfica de HTML5. |
"mdns" |
Otorga acceso a la extensión a la API de chrome.mdns. |
"proxy" |
Otorga a la extensión acceso a la API de chrome.proxy para administrar la configuración del proxy de Chrome. |
"tts" |
La API de chrome.tts reproduce texto a voz (TTS) sintetizado. |
"ttsEngine" |
La API de chrome.ttsEngine implementa un motor de texto a voz (TTS) con una extensión. |
"wallpaper" |
Solo en ChromeOS. Usa la API de chrome.wallpaper para cambiar el fondo de pantalla de ChromeOS. |
Consulta Cómo declarar permisos y advertir a los usuarios para obtener más información sobre los permisos disponibles y sus advertencias.
Paso 3: Solicita permisos opcionales
Solicita los permisos desde un gesto del usuario con permissions.request()
:
document.querySelector('#my-button').addEventListener('click', (event) => {
// Permissions must be requested from inside a user gesture, like a button's
// click handler.
chrome.permissions.request({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (granted) => {
// The callback argument will be true if the user granted the permissions.
if (granted) {
doSomething();
} else {
doSomethingElse();
}
});
});
Chrome le solicita al usuario que agregue los permisos si estos generan mensajes de advertencia diferentes de los que el usuario ya vio y aceptó. Por ejemplo, el código anterior podría generar un mensaje como el siguiente:
Paso 4: Verifica los permisos actuales de la extensión
Para verificar si tu extensión tiene un permiso específico o un conjunto de permisos, usa permission.contains()
:
chrome.permissions.contains({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (result) => {
if (result) {
// The extension has the permissions.
} else {
// The extension doesn't have the permissions.
}
});
Paso 5: Quita los permisos
Debes quitar los permisos cuando ya no los necesites. Después de que se quita un permiso, llamar a permissions.request()
suele volver a agregar el permiso sin solicitarle al usuario que lo haga.
chrome.permissions.remove({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (removed) => {
if (removed) {
// The permissions have been removed.
} else {
// The permissions have not been removed (e.g., you tried to remove
// required permissions).
}
});
Tipos
Permissions
Propiedades
-
orígenes
string[] opcional
Es la lista de permisos de host, incluidos los que se especifican en las claves
optional_permissions
opermissions
del manifiesto, y los que están asociados con los Content Scripts. -
permisos
string[] opcional
Es una lista de permisos con nombre (no incluye hosts ni orígenes).
Métodos
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Verifica si la extensión tiene los permisos especificados.
Parámetros
-
permisos
-
callback
función opcional
El parámetro
callback
se ve de la siguiente manera:(result: boolean) => void
-
resultado
booleano
Es verdadero si la extensión tiene los permisos especificados. Si un origen se especifica como un permiso opcional y como un patrón de coincidencia de la secuencia de comandos de contenido, se devolverá
false
, a menos que se otorguen ambos permisos.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas solo se admiten en Manifest V3 y versiones posteriores. Otras plataformas deben usar devoluciones de llamada.
getAll()
chrome.permissions.getAll(
callback?: function,
): Promise<Permissions>
Obtiene el conjunto actual de permisos de la extensión.
Parámetros
-
callback
función opcional
El parámetro
callback
se ve de la siguiente manera:(permissions: Permissions) => void
-
permisos
Son los permisos activos de la extensión. Ten en cuenta que la propiedad
origins
contendrá los orígenes otorgados de los especificados en las clavespermissions
yoptional_permissions
del manifiesto, y los asociados con los Content Scripts.
-
Muestra
-
Promise<Permissions>
Chrome 96 y versiones posterioresLas promesas solo se admiten en Manifest V3 y versiones posteriores. Otras plataformas deben usar devoluciones de llamada.
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Quita el acceso a los permisos especificados. Si hay algún problema para quitar los permisos, se establecerá runtime.lastError
.
Parámetros
-
permisos
-
callback
función opcional
El parámetro
callback
se ve de la siguiente manera:(removed: boolean) => void
-
quitado
booleano
Es verdadero si se quitaron los permisos.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas solo se admiten en Manifest V3 y versiones posteriores. Otras plataformas deben usar devoluciones de llamada.
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Solicita acceso a los permisos especificados y muestra un mensaje al usuario si es necesario. Estos permisos deben definirse en el campo optional_permissions
del manifiesto o ser permisos obligatorios que el usuario no otorgó. Se ignorarán las rutas de acceso en los patrones de origen. Puedes solicitar subconjuntos de permisos de origen opcionales. Por ejemplo, si especificas *://*\/*
en la sección optional_permissions
del manifiesto, puedes solicitar http://example.com/
. Si hay algún problema para solicitar los permisos, se establecerá runtime.lastError
.
Parámetros
-
permisos
-
callback
función opcional
El parámetro
callback
se ve de la siguiente manera:(granted: boolean) => void
-
concedido
booleano
Es verdadero si el usuario otorgó los permisos especificados.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas solo se admiten en Manifest V3 y versiones posteriores. Otras plataformas deben usar devoluciones de llamada.
Eventos
onAdded
chrome.permissions.onAdded.addListener(
callback: function,
)
Se activa cuando la extensión adquiere permisos nuevos.
Parámetros
-
callback
función
El parámetro
callback
se ve de la siguiente manera:(permissions: Permissions) => void
-
permisos
-
onRemoved
chrome.permissions.onRemoved.addListener(
callback: function,
)
Se activa cuando se quita el acceso a los permisos de la extensión.
Parámetros
-
callback
función
El parámetro
callback
se ve de la siguiente manera:(permissions: Permissions) => void
-
permisos
-