Descripción
Usa la API de chrome.permissions
para solicitar permisos opcionales declarados durante el tiempo de ejecución en lugar de la instalación, de modo que los usuarios comprendan por qué los permisos son necesarios y otorguen solo los necesarios.
Conceptos y uso
Las advertencias de permisos existen para describir las capacidades otorgadas por una API, pero algunas de estas advertencias pueden no ser obvias. La API de Permissions permite que los desarrolladores expliquen las advertencias de permisos y que introduzcan funciones nuevas gradualmente, lo que brinda a los usuarios una introducción sin riesgos a la extensión. De esta manera, los usuarios pueden especificar cuánto acceso están dispuestos a otorgar y qué funciones quieren habilitar.
Por ejemplo, la funcionalidad principal de la extensión de permisos opcionales anula la página Nueva pestaña. Una función muestra el objetivo del día del usuario. Esta función solo requiere el permiso storage, que no incluye una advertencia. La extensión tiene una función adicional que los usuarios pueden habilitar con un clic en el siguiente botón:
Para mostrar los sitios principales del usuario, se requiere el permiso topSites, que tiene la siguiente advertencia.
.Cómo implementar 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 necesarios cuando se necesiten para la funcionalidad básica de la extensión.
- Usa permisos opcionales cuando se necesiten para las funciones opcionales de tu extensión.
Ventajas de los permisos obligatorios:
- Menos mensajes: Una extensión puede solicitar al usuario que acepte todos los permisos una vez.
- Desarrollo más simple: Se garantiza la presencia de los permisos necesarios.
Ventajas de los permisos opcionales:
- Mejor seguridad: Las extensiones se ejecutan con menos permisos, ya que los usuarios solo habilitan los permisos. que se necesiten.
- Información más precisa para los usuarios: Una extensión puede explicar por qué necesita un permiso en particular. cuando el usuario habilita la función relevante.
- Actualizaciones más fáciles: Cuando actualizas tu extensión, Chrome no la inhabilitará para los usuarios en los siguientes casos: la actualización agregará permisos opcionales en lugar de obligatorios.
Paso 2: Declara permisos opcionales en el manifiesto
Declara permisos opcionales en el 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 quieres solicitar hosts que solo descubres durante 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 una coincidencia
.
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 chrome.debugger funciona como un transporte alternativo para la depuración remota de Chrome protocolo. |
"declarativeNetRequest" |
Otorga a la extensión acceso a chrome.declarativeNetRequest. |
"devtools" |
Permite que la extensión expanda las Herramientas para desarrolladores de Chrome. funcionalidad. |
"geolocation" |
Permite que la extensión use la API de geolocation de HTML5. |
"mdns" |
Otorga a la extensión acceso al chrome.mdns. |
"proxy" |
Otorga a la extensión acceso a la API de chrome.proxy para administrar el proxy de Chrome configuración. |
"tts" |
La API chrome.tts reproduce contenido de texto a voz (TTS). |
"ttsEngine" |
La API chrome.ttsEngine implementa una de texto a voz (TTS) con una extensión. |
"wallpaper" |
Solo para ChromeOS. Usa la API de chrome.wallpaper para cambiar ChromeOS. fondo de pantalla. |
Consulta Cómo declarar permisos 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 pregunta al usuario si, al agregar los permisos, se muestran mensajes de advertencia diferentes a los que que el usuario ya vio y aceptó. Por ejemplo, el código anterior podría generar una instrucción como esto:
Paso 4: Verifica los permisos actuales de la extensión
Para comprobar si tu extensión tiene un permiso o un conjunto de permisos específicos, 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 quitar un permiso,
Por lo general, cuando se llama a permissions.request()
, se vuelve a agregar el permiso sin preguntarle al usuario.
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 del host, incluidos los especificados en las claves
optional_permissions
opermissions
del manifiesto, y aquellos asociados con secuencias de comandos de contenido. -
permisos
string[] opcional
Lista de permisos con nombre (no incluye hosts ni orígenes).
Métodos
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
)
Comprueba 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
boolean
Es verdadero si la extensión tiene los permisos especificados. Si se especifica un origen como permiso opcional y patrón de coincidencia de secuencia de comandos de contenido, se mostrará
false
, a menos que se otorguen ambos permisos.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución de llamada.
getAll()
chrome.permissions.getAll(
callback?: function,
)
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
Los permisos activos de la extensión. Ten en cuenta que la propiedad
origins
contendrá los orígenes otorgados a partir de los que se especifican en las clavespermissions
yoptional_permissions
del manifiesto y aquellos asociados con las secuencias de comandos de contenido.
-
Muestra
-
Promise<Permissions>
Chrome 96 y versiones posterioresLas promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución de llamada.
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
)
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
boolean
Es verdadero si se quitaron los permisos.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución de llamada.
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
)
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 retuvo. Se ignorarán las rutas de acceso en 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 con la solicitud de 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
boolean
Es verdadero si el usuario otorgó los permisos especificados.
-
Muestra
-
Promise<boolean>
Chrome 96 y versiones posterioresLas promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución 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 desde la extensión.
Parámetros
-
callback
función
El parámetro
callback
se ve de la siguiente manera:(permissions: Permissions) => void
-
permisos
-