web-dev-qa-db-fra.com

getCurrentPosition () et watchPosition () sont déconseillés pour des origines non sûres

Je reçois cette erreur sur mon site Web qui demande des données de géolocalisation à l'utilisateur:

getCurrentPosition () et watchPosition () sont déconseillées sur des origines non sûres et le support sera supprimé à l'avenir. Vous devriez envisager de basculer votre application vers une origine sécurisée, telle que HTTPS. Voir goo.gl/rStTGz pour plus de détails.

Je veux dire que c'est fondamentalement juste un avis, et le lien Google dit simplement que c'est obsolète.

Je n'ai pas l'intention de migrer mon site Web vers SSL ... existe-t-il une alternative pour quelqu'un comme moi?

53
Jason Axelrod

Nous avons trouvé une réponse probable dans les messages de/jstillwell ici: https://github.com/stefanocudini/leaflet-gps/issues/15 fondamentalement, cette fonctionnalité ne sera pas prise en charge (in Chrome seulement?) dans le futur, mais seulement pour les sites HTTP. Le protocole HTTPS fonctionnera toujours et il n’est pas prévu de créer un remplaçant équivalent pour l’utilisation HTTP.

15
kittimiyo

Parce que passer à HTTPS peut être douloureux ou impossible selon votre architecture, j'ai trouvé une solution de contournement: vous pouvez utiliser le API de géolocalisation de Google Maps . Bien qu'il ait des limites d'utilisation, il fait le travail. Vous aurez besoin d'une clé d'API de navigateur, alors n'oubliez pas de limiter son utilisation à votre nom d'hôte de page.

Je l'utilise comme méthode de secours pour la méthode getCurrentPosition() en cas d'échec. Cela me permet de le faire fonctionner jusqu'à ce que je passe en HTTPS.

Voici les JSFiddles:

  • HTTP : getCurrentPosition() échouera et retombera sur l'API
  • HTTPS : getCurrentPosition() va réussir
41
gogson

Oui. Google Chrome a déconseillé d'utiliser cette fonctionnalité dans la version 50. Si vous avez essayé de l'utiliser dans chrome, l'erreur est la suivante:

getCurrentPosition() and watchPosition() are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure Origin, such as HTTPS. See https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins for more details.

Donc, vous devez ajouter un certificat SSL. Eh bien, c'est le seul moyen.

Et il est assez facile maintenant d'utiliser Encryptage . Voici guide

Et à des fins de test, vous pouvez essayer ceci:

1.localhost est traité comme une origine sécurisée sur HTTP. Par conséquent, si vous êtes en mesure d'exécuter votre serveur à partir de localhost, vous devriez pouvoir tester la fonctionnalité sur ce serveur.

2.Vous pouvez exécuter chrome avec l'indicateur --unsafely-treat-insecure-Origin-as-secure = "http://example.com" (en remplaçant "example.com" par l'origine que vous avez réellement sélectionnée). vouloir tester), qui traitera cette origine comme étant sécurisée pour cette session. Notez que vous devez également inclure le répertoire --user-data-dir =/test/only/profile/dir pour créer un nouveau profil de test pour que l’indicateur fonctionne.

Je pense que Firefox a également empêché l'utilisateur d'accéder aux requêtes d'API GeoLocation de http. Voici le changelog du webkit: https://trac.webkit.org/changeset/200686

14
Asim K T

Vous pouvez utiliser l'API https://ipinfo.io (c'est mon service). C'est gratuit jusqu'à 1 000 req/jour (avec ou sans support SSL). Il vous donne des coordonnées, nom et plus. Voici un exemple:

curl ipinfo.io
{
  "ip": "172.56.39.47",
  "hostname": "No Hostname",
  "city": "Oakland",
  "region": "California",
  "country": "US",
  "loc": "37.7350,-122.2088",
  "org": "AS21928 T-Mobile USA, Inc.",
  "postal": "94621"
}

Voici un exemple qui construit un objet coords avec la réponse de l'API qui correspond à ce que vous obtenez de getCurrentPosition():

$.getJSON('https://ipinfo.io/geo', function(response) { 
    var loc = response.loc.split(',');
    var coords = {
        latitude: loc[0],
        longitude: loc[1]
    };
});

Et voici un exemple détaillé qui montre comment vous pouvez l'utiliser comme solution de secours pour getCurrentPosition():

function do_something(coords) {
    // Do something with the coords here
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

Voir http://ipinfo.io/developers/replacing- navigator-geolocation-getcurrentposition pour plus de détails.

11
Ben Dowling

Vous pouvez exécuter chrome avec l'indicateur --unsafely-treat-insecure-Origin-as-secure = "http://example.com" (en remplaçant "example.com" par l'origine que vous souhaitez réellement utiliser). test), qui traitera cette origine comme étant sécurisée pour cette session. Notez que vous devez également inclure le répertoire --user-data-dir =/test/only/profile/dir afin de créer un nouveau profil de test pour que l’indicateur fonctionne.

Par exemple, si vous utilisez Windows, cliquez sur Démarrer, puis exécutez.

chrome --unsafely-treat-insecure-Origin-as-secure="http://localhost:8100"  --user-data-dir=C:\testprofile
5
Injection

Pour dev uniquement, vous pouvez autoriser des domaines locaux spécifiques à utiliser ces fonctionnalités:

https://medium.com/@Carmichaelize/enabling-the-microphone-camera-in-chrome-for-local-unsecure-origins-9c90c3149339

0
Paul

Je sais que l’API de géolocalisation est meilleure, mais pour les personnes qui ne peuvent pas utiliser un protocole SSL, vous pouvez toujours utiliser certains types de services tels que geopluginService .

comme spécifié dans la documentation, vous envoyez simplement une requête avec l'adresse ip au service URL http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx la sortie est un tableau sérialisé; vous devez donc le désérialiser avant de l'utiliser.

Rappelez-vous que ce service n’est pas très précis comme le géolocalisation, mais reste une solution simple et rapide.

0
Jeffery ThaGintoki

Dans HTTP l'erreur se produit.

Définissez l’autorisation pour localhost dans l’étiquette ci-dessous (acceptez les demandes de ces sites HTTP).

Cela a fonctionné pour moi.

0
srmilon