Как я могу использовать API геолокации в Firefox (локальная разработка)? - PullRequest
1 голос
/ 13 июля 2020

Я пишу приложение, использующее API геолокации . Одним из требований этого API является то, что он должен использоваться поверх HTTPS.

Следующий сценарий оболочки показывает процесс, который я использовал для настройки HTTPS для localhost:

echo "Started local certificate setup script."

# Generate a private 2048-bit RSA key and encrypt it using triple DES before outputting it
openssl genrsa -des3 -out rootCA.key 2048

# Create a root CA public certificate
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 825 -out rootCA.pem

# Create a new certificate signing request (CSR) and a new private key
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf

# Using the previously generated CSR, and the root CA cert, generate a server.crt which will be the certificate file we use for localhost
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 825 -sha256 -extfile v3.ext

echo "Trust the root certificate (add it to the system keychain): "
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.pem # macOS specific step

Начальные файлы в приведенных выше командах OpenSSL находятся здесь:

v3.ext:

authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost

server.csr.cnf:

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=CA
ST=RandomProvince
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=admin@whatever.com
CN = localhost

Это отлично работает для локальных разработка Chrome (в настоящее время версия 83.0.4103.116). Мы видим, что получаем самоподписанный сертификат root, и Chrome доверяет ему:

enter image description here

Chrome also trusts the localhost certificate which uses this root CA that we've created for local development:

enter image description here

However, there are times when I'd like to also run locally using Firefox. Whenever I'm using Firefox I get the following: SEC_ERROR_UNKNOWN_ISSUER. I can get past this error in Firefox by using about:config and then turning security.enterprise_roots.enabled to true. At this point Firefox doesn't complain at all about the certificate - but all requests for the user location result in permission denied errors.

Even clicking "Allow Location Access" in the following pop-up results in the geolocation API thowing an error saying that permission was denined to access the user location:

введите описание изображения здесь

Я использую следующую функцию для получения местоположения (аргумент контекста, поскольку он находится в проекте Vue. js с использованием Vuex):

findCurrentPosition(context) {
    const options = {
      timeout: 20000,
      enableHighAccuracy: false,
      maximumAge: Infinity,
    }
    return new Promise((resolve, reject) => {
      if ('geolocation' in navigator) {
        navigator.geolocation.getCurrentPosition(
          position => {
            const lat = position.coords.latitude
            const lon = position.coords.longitude
            setLocation(context, [lat, lon])
            resolve([lat, lon])
          },
          error => {
            switch (error.code) {
              case error.PERMISSION_DENIED:
                console.log('User denied the request for Geolocation.') // in Firefox, even after explicitly allowing location access, this is always hit
                break
              case error.POSITION_UNAVAILABLE:
              case error.TIMEOUT:
              case error.UNKNOWN_ERROR:
                // get location another way
            }
            reject([])
          },
          options,
        )
      } else {
        // get location another way
      }
    })
  }

Как можно Я использую API геолокации в Firefox при локальной разработке? Я отключил все расширения Firefox, чтобы исключить возможность того, что одно из них мешает определению местоположения.

...