getCurrentPosition () e watchPosition () estão obsoletos em origens inseguras

Estou recebendo este erro no meu website, que solicita dados de localização geográfica do usuário:

getCurrentPosition () e watchPosition () estão obsoletos em origens inseguras e o suporte será removido no futuro. Você deve considerar mudar seu aplicativo para uma origem segura, como HTTPS. Veja goo.gl/rStTGz para mais detalhes.

Quero dizer, é basicamente apenas um aviso, e o link do google apenas diz que está sendo preterido.

Eu não tenho planos de mudar meu site para SSL … então existe uma alternativa para alguém como eu?

Encontrou uma resposta provável nas postagens de / jstillwell aqui: https://github.com/stefanocudini/leaflet-gps/issues/15 basicamente este recurso não será suportado (somente no Chrome?) No futuro, mas apenas para sites HTTP. O HTTPS ainda estará ok e não há planos para criar um substituto equivalente para o uso do HTTP.

Como a mudança para HTTPS pode ser dolorosa ou impossível, dependendo da sua arquitetura, encontrei uma solução alternativa: você pode usar a API de geolocalização do Google Maps . Embora tenha limites de uso, ele faz o trabalho. Você precisará de uma chave de API do navegador, portanto, não se esqueça de limitar seu uso ao nome do host da sua página.

Eu uso-o como um método de fallback para o método getCurrentPosition() se ele falhar. Isso me permite fazê-lo funcionar até eu mudar para HTTPS.

Aqui está o JSFiddles:

  • HTTP : getCurrentPosition() falhará e voltará para a API
  • HTTPS : getCurrentPosition() será bem-sucedido

Sim. O Google Chrome substituiu o recurso na versão 50. Se você tentou usá-lo no Google Chrome, o erro é:

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.

Então, você precisa adicionar o certificado SSL. Bem, esse é o único caminho.

E agora é bem fácil usar o Let’s Encrypt . Aqui está o guia

E para fins de teste, você pode tentar isto:

1.localhost é tratado como uma origem segura em HTTP, portanto, se você puder executar seu servidor a partir do host local, deverá poder testar o recurso nesse servidor.

2.Você pode executar o chrome com o sinalizador –unsafely-treat-insecure-origin-as-secure = “http://example.com” (substituindo “example.com” pela origem que você realmente deseja testar), tratará essa origem como segura para esta session. Note que você também precisa include o –user-data-dir = / teste / apenas / profile / dir para criar um novo perfil de teste para o sinalizador funcionar.

Eu acho que o Firefox também restringiu o usuário de acessar solicitações de API do GeoLocation de http . Aqui está o changelog do webkit: https://trac.webkit.org/changeset/200686

Você poderia usar a API https://ipinfo.io para isso (é meu serviço). É gratuito para até 1.000 req / dia (com ou sem suporte SSL). Dá-lhe coordenadas, nome e mais. Aqui está um exemplo:

 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" } 

Aqui está um exemplo que constrói um object de coords com a resposta da API que corresponde ao que você obtém de getCurrentPosition() :

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

E aqui está um exemplo detalhado que mostra como você pode usá-lo como um fallback para 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); }); }; }); 

Veja http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition para mais detalhes.

Você pode executar o chrome com o sinalizador –unsafely-treat-insecure-origin-as-secure = “http://example.com” (substituindo “example.com” pela origem que você realmente deseja testar), que tratará essa origem como segura para esta session. Note que você também precisa include o –user-data-dir = / teste / apenas / profile / dir para criar um novo perfil de teste para o sinalizador funcionar.

Por exemplo, se usar o Windows, clique em Iniciar e execute.

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

No HTTP, o erro ocorre.

Definir permissão para localhost no label abaixo (aceitar solicitações desses referenciadores HTTP (sites da Web)).

Isso funcionou para mim.

Use o FireFox ou qualquer outro navegador em vez do Chrome se você quiser testá-lo em seu ambiente de desenvolvimento, para produção, não há como usar https .

Para o ambiente de desenvolvimento, basta abrir http://localhost:8100/ on FireFox e, infelizmente, nenhum erro.

Eu sei que a API geoLocation é melhor, mas para pessoas que não podem usar um SSL, você ainda pode usar algum tipo de serviço, como o geopluginService .

como especificado na documentação, você simplesmente envia uma solicitação com o ip para a url do serviço http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx a saída é uma matriz serializada, então você precisa para desserializá-lo antes de usá-lo.

Lembre-se que este serviço não é muito preciso, pois o geoLocation é, mas ainda é uma solução fácil e rápida.

Dê um tempo para instalar um watchPosition() SSL getCurrentPosition() e watchPosition() não funciona mais em origens inseguras. Para usar esse recurso, você deve considerar a troca de seu aplicativo para uma origem segura, como HTTPS.