API Permissions para a Web

Se você já trabalhou com a API Geolocation, provavelmente já quis verificar se tinha permissão para usar a Geolocation sem gerar uma solicitação. Isso simplesmente não era possível. Você precisava solicitar a posição atual, e isso indicava o estado da permissão ou fazia com que uma solicitação fosse mostrada ao usuário.

Nem todas as APIs funcionam dessa forma. A API Notifications tem uma maneira própria de permitir que você verifique o estado atual da permissão usando Notification.permission.

À medida que a plataforma da Web cresce em APIs, é necessário ter uma única maneira padrão para os desenvolvedores verificarem o status de uma permissão, em vez de precisar lembrar como cada API funciona. A API Permission, disponível na versão 43 do Chrome, tem como objetivo ser o único método padrão para verificar o status de permissão de uma API.

permissions.query()

Verifique o status de uma permissão usando o método permissions.query(). Isso retornará um status de concedido (você tem permissão), negado (o acesso à API está bloqueado) ou solicitar (o usuário precisa ser solicitado). Exemplo:

// Check for Geolocation API permissions
navigator.permissions.query({name:'geolocation'})
    .then(function(permissionStatus) {
    console.log('geolocation permission state is ', permissionStatus.state);

    permissionStatus.onchange = function() {
        console.log('geolocation permission state has changed to ', this.state);
    };
    });

O método de consulta usa um objeto PermissionDescriptor, em que você define o nome da permissão. A resposta é uma promessa resolvida para um objeto PermissionStatus. Nesse objeto, é possível verificar o estado com permissionStatus.state para "granted", "denied" ou "prompt". Também é possível implementar um gerenciador de eventos para permissionStatus.onchange e processar mudanças no estado da permissão.

PermissionDescriptors compatíveis

No exemplo acima, destacamos como consultar o estado da permissão para geolocalização com o seguinte descritor de permissão: {name:'geolocation'}.

O descritor de permissão de notificação é semelhante, já que requer apenas um atributo de nome: {name:'notifications'}.

Push e midi têm um parâmetro adicional específico para essa API.

Para a permissão de push, é possível fornecer um parâmetro userVisibleOnly. Isso indica se você quer mostrar uma notificação para cada mensagem push ou enviar notificações push silenciosas. No momento, o Chrome só oferece suporte a mensagens push com notificações. Você usaria da seguinte forma:

navigator.permissions.query({name:'push', userVisibleOnly:true})

O Midi permite um parâmetro sysex. Isso indica se você precisa e/ou recebe mensagens exclusivas do sistema. Para midi, seria:

navigator.permissions.query({name:'midi', sysex:true})

Como solicitar permissões

A solicitação de permissão do usuário depende da API específica. Por exemplo, a geolocalização mostraria uma solicitação de permissão quando você chamasse getCurrentPosition().

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

As notificações acionavam o usuário quando você chamava requestPermission().

Notification.requestPermission(function(result) {
    if (result === 'denied') {
    console.log('Permission wasn\'t granted. Allow a retry.');
    return;
    } else if (result === 'default') {
    console.log('The permission request was dismissed.');
    return;
    }
    console.log('Permission was granted for notifications');
});

O ponto aqui é que a API Permission permite uma maneira consistente de monitorar o status das permissões, além de oferecer suporte à variedade de APIs atualmente na Web.

A grande vantagem disso é que você pode criar experiências melhores para os usuários, solicitando apenas quando for óbvio para o usuário por que você precisa de privilégios extras e aproveitando ao máximo essas APIs quando você souber que recebeu a permissão.

Confira um conjunto completo de exemplos aqui.

Compatibilidade com navegadores

O Chrome é o primeiro navegador a implementar isso. A Mozilla está planejando o envio, e a Microsoft demonstrou interesse na API.

Problemas conhecidos

  • A geolocalização não vai mostrar novamente um aviso se o usuário dispensar a solicitação de permissão. No entanto, o status da permissão permanece como "prompt". [bugs.chromium.org]