Hizmet çalışanlarını HTTP aracılığıyla test etme seçenekleri


103

Hizmet çalışanlarını test etmek istiyorum ancak sanal bir ana bilgisayar kurulumum var ve localhost'ta https'yi etkinleştiremiyorum.

Yerel ana bilgisayardaki hizmet işçisine kaydolmaya çalıştığımda hizmet çalışanlarını test etmek için yerel sanal ana makine url'mi nasıl beyaz listeye alabilirim? Chrome, hizmet çalışanını etkinleştirmek için https gerektiğini söylüyor. En azından yerel testler için bu kısıtlamayı nasıl aşabilirim.

Yanıtlar:


149

Genel olarak, servis çalışanlarını kullanmak için hem sayfanıza hem de servis çalışanı komut dosyanızı HTTPS aracılığıyla sunmanız gerekir. Gerekçe, Güçlü Yeni Özellikler İçin Güvenli Kökenleri Tercih Et bölümünde açıklanmaktadır .

Yerel geliştirmeyi kolaylaştırmak için yürürlükte olan HTTPS gereksiniminin bir istisnası vardır: sayfanıza ve hizmet çalışanı betiğinize aracılığıyla http://localhost[:port]veya aracılığıyla erişirseniz http://127.x.y.z[:port], hizmet çalışanları başka bir işlem yapılmadan etkinleştirilmelidir.

Chrome'un son sürümlerinde, bu yanıtta açıklandığı gibichrome://flags/#unsafely-treat-insecure-origin-as-secure , yerel geliştirme yoluyla bu gereksinimi aşabilirsiniz .

Firefox , ayar aracılığıyla benzer işlevler sunardevtools.serviceWorkers.testing.enabled .

Bu işlevselliği olduğuna dikkat edin sadece o aksi gerçekleşmesi mümkün olmaz test olanağı yaratan ve her zaman sitenizin üretim versiyonunu sunarken HTTPS kullanarak planlamalısınız. Gerçek kullanıcılardan bu bayrakları etkinleştirme adımlarından geçmelerini istemeyin!


teşekkürler jeff hemen deneyecek. kesinlikle bunu sadece test etmek için kullanıyorum .. Şu an için umutsuz bir çözüm gerekiyor ... !! ideal bir uygulama bilmiyorum .. ama umutsuz zamanlar umutsuz bir önlem gerektirir ... !! lütfen bana zor kazandığım 4 puanı geri verir misiniz ... Uygun olmadığını düşünürseniz soruyu silerim ve bu yanlış davranışı teşvik eder
Aman Satija

1
localhost'ta servis çalışanını kullanıyor, ancak sw.js dosyasını sunucudan almaya çalıştığında net :: ERR_INSECURE_RESPONSE,
sp1rs

2
Teşekkürler! Okumak için ana gövdeyi güncelledim devtools.serviceWorkers.testing.enabled.
Jeff Posnick

6
Yukarıdakileri bulmakta güçlük çeken herkes için - açık FF - dev araçları - ayarlar dişli çarkı - gelişmiş ayarlar - http üzerinden sw özelliğini etkinleştirin. Ardından, url'de # çalışan hata ayıklama veya araç çubuğundaki araçlar - web geliştirici - hizmet çalışanları hakkında gidebilirsiniz. İşçiyi başlatın!
Sten Muchow

@StenMuchow 'ın yanıtı benim için Chrome Mac ve Windows'ta çalışıyor
Mohamed Hussain

52

Aşamalı bir web uygulamasının gerçek bir davranış testi için fişe takılı bir mobil cihazın servis çalışanında hata ayıklamak istiyorsanız , ssl krom başlatma seçenekleri yardımcı olmaz ve kesinlikle sertifika satın almanıza gerek yoktur.

@ chris-ruppel, proxy yazılımı yüklemekten bahsetti, ancak aslında bağlantı noktası yönlendirmeyi kullanmanın daha kolay bir yolu var :

Cihazınızı Chrome kullanarak bağladığınızı ve hatalarını ayıkladığınızı varsayarsak:

  • Chrome Geliştirici Araçları "Uzak cihazlar" bölümünde "Ayarlar" ı açın ve bir "Bağlantı noktası yönlendirme" kuralı ekleyin .
  • Localhost kurulumunuz localhost üzerinde çalışıyorsa: 80,
  • sadece "Cihaz bağlantı noktası 8080" kuralı ekleyin (ayrıcalıklı olmayan herhangi bir bağlantı noktası> 1024 olabilir)
  • ve yerel adres "localhost: 80" (veya mytestserver.sometestdomainwithoutssl.company:8181 veya her neyse)

Bunu yaptıktan sonra , mobil cihazınızda " http: // localhost: 8080 " URL'sini çağırabilirsiniz ve gerçek PC'nizdeki / test sunucunuzdaki "localhost: 80" tarafından yanıtlanacaktır . Servis çalışanları ile, sanki cep telefonunuzda çalışan yerel makinenizmiş gibi mükemmel çalışır.

Mobil cihazınızda ayrıcalıksız bağlantı noktalarını kullanmayı unutmadığınız sürece, birden çok bağlantı noktası iletimi ve farklı hedef etki alanları için de çalışır. Ekran görüntüsüne bakın: Cep telefonundan çağrıldığında bilgisayarı arayacak bazı yapılandırılmış bağlantı noktalarının ekran görüntüsüne bakın

Bu bilgilerin kaynağı, google uzak cihaz belgeleridir: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/local-server (ancak Nisan 2017 itibarıyla bunu okumak çok açık değil basit cevap)


Umut verici görünüyor ama benim için işe yaramadı. Bağlantı noktası yönlendirmeyi ayarladıktan sonra Android 5.0.2'de localhost'u ziyaret etmeye çalışırken "Bu siteye ulaşılamıyor" diyor.
Jackson

Yani localhost'ta https'ye ihtiyacınız yok mu? SW iyi çalışacak mı?
Machado

2
Kabul edilen cevap bu olmalı, iyi çalışıyor
Miquel

Hızlı ve kolay! Telefonunuzda USB Hata Ayıklamayı etkinleştirmeyi ve kabul etmeyi ve USB aracılığıyla PC'nize takmayı unutmayın. Teşekkürler dostum!
Marcos R

Ancak yalnızca http için, https üzerinden kaynak talep ederseniz, önbelleğe alınmazlar.
Efsaneler

24

Genellikle gerçek bir cihazda hata ayıklamak ve test etmek istiyorum. Bulduğum bir yöntem, yerel geliştirme sırasında telefonun ağ trafiğini Charles Proxy üzerinden yönlendirmeyi içeriyor . Chrome'a ​​özgü tüm çözümlerin aksine, bu telefonunuzdaki herhangi bir tarayıcıyla çalışır.

  1. Charles'ı dizüstü bilgisayarımda çalıştırın (aynı zamanda web siteme Servis Görevlisi ile hizmet eder). Charles çalıştıktan sonra, Adım 2 için IP / bağlantı noktasını not edin.
  2. Mobil cihazı dizüstü bilgisayarımı proxy olarak kullanacak şekilde yapılandırın.
    • Android için ayarlar> Ağı değiştir > Gelişmiş Ayarlar > Proxy'de WiFi'nize dokunup basılı tutun . IP / bağlantı noktasını ayarlamak için Manuel'i kullanın .
    • İOS için (i) simgesi> HTTP Proxy bölümünü tıklayın. Manuel'i seçin , ardından IP / bağlantı noktasını ayarlayın.
  3. localhostMobil cihazımda ziyaret etmek artık Hizmet Görevlisinin kaydolmasına ve test edilmesine izin veriyor.

4
Ben de bu problemle karşı karşıyayım, çok teşekkürler. Bir proxy olmadan mobil cihazı test etmek tamamen imkansızdır. bu gönderi daha fazla oy gerekiyor.
Phyo Arkar Lwin

1
@ chris-ruppel Aslında, bunu Chrome Dev Tools kullanarak ekstra proxy yazılımı olmadan yapmanın bir yolu var. Bu konuya ayrıntılı bir cevap ekledim.
Christopher Lörken

"Mobil cihazı test etmek tamamen imkansızdır;" ama bu küçük bir dikkatsizlik. Servis çalışanlarını belirten insanları alkışlayalım ...
Jackson

Chris, "1. Charles'ı dizüstü bilgisayarımda çalıştır" konusunu açıklayabilir misin? Charles proxy kurulabilir. Bilgisayarında localhost: 8080'de çalışan bir sunucusu var. Sonra ne? Ayrıca "IP / bağlantı noktasını not et" de diyorsunuz. Nerede?
Jackson

1
@ChrisRuppel ngrok.com'a geçtim : Ücretsiz, yerel uygulamam için herkese açık bir HTTPS sitesi oluşturuyor ve harika çalışıyor! İlk çalıştırmanın bağlanması biraz zaman aldı. Önerdiğim tek şey, ABD'de değilseniz bölgeleri değiştirmektir ( ngrok.com/docs#config-options , "bölgeler" parametresi).
Karsten Silz

12

Benim durumumda pwa'yı test etmenin en kolay yolu ngrok kullanmaktı. https://ngrok.com/download oturum açın, ur belirteci alın ve ayarlayın!

Çalıştırdığınızda ./ngrok http {your server port}, yukarıdaki bu komutu çalıştırdıktan sonra terminalde gösterilecek olan https'yi kullandığınızdan emin olun.


Sen kullanabilirsiniz https://surge.sh burada ziyaret ederseniz, bu ana bilgisayar için statik bir web sayfasıdır de: https://surge.sh/help/securing-your-custom-domain-with-ssl mümkün olacak ssl sertifikasının nasıl ayarlanacağını görün


Büyü gibi çalıştı! Harika tavsiye için teşekkürler!
Karsten Silz

bu da yardımcı oluyor, ancak deniz fenerini kullanarak rapor oluşturmada sorun yaşıyorum
Cj Oyales

4

Localhost'ta bir web sunucusu çalıştıramayan bir istemci cihazda hizmet çalışanlarını test etmek istiyorsanız, genel teknik aşağıdaki gibidir:

  1. Sunucunuza bir ana bilgisayar adı verin.
  2. Bu ana bilgisayar adına bir sertifika verin.
  3. IP'lerin bu sertifikayı veren CA'ya güvenmesini sağlayın.

Ancak bunu söylemek yapmaktan daha kolay. Kasım 2016'da Reddit'te AMA'da bir Let's Encrypt temsilcisi kabul edildi "Gerçekten zor bir soru ve ben bugüne kadar hiç kimse tatmin edici bir cevap ile gelip sahip olduğunu düşünüyorum." HTTPS özel LAN üzerinde olduğu

Bilgisayarınıza bir ana bilgisayar adı vermenin yaygın yolları, ona sabit bir dahili IP adresi vermeyi içerir, her gün veya İnternet ağ geçidi cihazınızı her açtığınızda değişen bir adres değil. Geliştirme iş istasyonunuzun Ethernet kartının MAC adresi ile belirli bir özel adresi (genellikle içinde 10/8veya içinde 192.168/16) ilişkilendiren bir "rezervasyon" oluşturmak için ağınızdaki, genellikle ağ geçidinizdeki DHCP sunucusunu yapılandırmanız gerekir . Bunun için ağ geçidinizin kılavuzunu okuyun.

Artık geliştirme iş istasyonunuzun kararlı bir IP adresi olduğuna göre, zaman / para değiş tokuşu var. Gelişmiş DNS ve OpenSSL kullanımını öğrenmek ve test etmeyi planladığınız tüm cihazlara bir kök sertifika yüklemek istiyorsanız:

  1. Ağınızda dahili bir DNS sunucusu çalıştırın. Bu, ağ geçidinizde veya geliştirme iş istasyonunuzda olabilir.
  2. DNS sunucunuzu bazı oluşturulmuş TLD'ler için yetkili ve diğer TLD'ler için özyinelemeli olacak şekilde yapılandırın.
  3. Geliştirme iş istasyonunuzun özel IP adresine sabit bir ad verin. Bu ona dahili bir ad verir.
  4. DHCP sunucunuzu, bu DNS sunucusunun adresini kiralama alan diğer cihazlara verecek şekilde yapılandırın.
  5. Geliştirme iş istasyonunuzda, özel bir sertifika yetkilisi ve web sunucusu için anahtar çiftleri oluşturmak üzere OpenSSL'yi kullanın .
  6. OpenSSL'yi kullanarak, CA için bir kök sertifika ve web sunucusunun dahili adı için bir sertifika verin.
  7. Bu sertifikayı kullanarak geliştirme iş istasyonunuzdaki web sunucusunda HTTPS'yi yapılandırın.
  8. CA'nın kök sertifikasını tüm cihazlara güvenilir bir kök sertifika olarak yükleyin.
  9. Tüm cihazlarda bu dahili isme erişin.

Bir kök sertifika ekleyemiyorsanız veya yerel DNS'yi kontrol edemiyorsanız, örneğin başkalarının sahip olduğu cihazlarla (BYOD) veya kullanıcıların ana bilgisayarlarda olduğu gibi güvenilir kök sertifikaları eklemesine izin vermeyen daha kilitli tarayıcılarla test etmeyi planlıyorsanız video oyun konsolları için tam nitelikli bir alan adına (FQDN) ihtiyacınız olacak:

  1. API ile DNS sunan bir kayıt şirketinden bir alan satın alın . Bu, doğrudan bir TLD içinde veya bunu Genel Son Ek Listesi'ne yerleştiren dinamik DNS sağlayıcılarından biri olabilir. (PSL olmayan dinamik DNS sağlayıcıları, Let's Encrypt tarafından uygulanan hız sınırlamaları nedeniyle kabul edilemez. .)
  2. Bu alanın bölge dosyasında bir A geliştirme iş istasyonunuzun özel IP adresine kaydı edin. Bu, geliştirme iş istasyonunuza bir FQDN sağlar.
  3. Let's Encrypt sertifika yetkilisinden bu FQDN için bir sertifika almak üzere , sorgulamayı destekleyen bir ACME istemcisi olan Dehydrated'yi kullanın dns-01.
  4. Bu sertifikayı kullanarak geliştirme iş istasyonunuzdaki web sunucusunda HTTPS'yi yapılandırın.
  5. Tüm cihazlarda bu isme erişin.

3

Jeff'in ilk yanıtta bahsettiği gibi, Service Workers'ı test etmek için localhost düzeyinde https'ye ihtiyacınız yoktur. Hizmet çalışanları, HTTPS olmadan localhost etki alanına eriştiğiniz sürece kayıt olacak ve sorunsuz çalışacaktır.

Uygulamanızı localhost'ta test ettirdikten ve gerçek olarak https ile nasıl çalıştığını görmek istediğinizde, en basit yaklaşım uygulamanızı GitHub'a yüklemek olacaktır. Ücretsiz (ve HTTPS ile!) Bir genel alan adı oluşturabilirsiniz.

Talimatlar şu şekildedir: https://pages.github.com/


1
Takip eden soru, Yazılım Önerileri için bir soru olacaktır: iOS ve Android için hangi web sunucuları, localhost yöntemini kullanarak bir mobil cihaz üzerinde test etmek için önerilir?
Damian Yerrick

Erlang HTTP Sunucusu kullanıyorum ama herhangi bir sunucu çalışmalı. Google Marketplace'den erişebileceğiniz Chrome'dan 200 HTTP sunucusundan önce kullandım.
Miguel Guardo

1

Hizmet çalışanını test etmenin en kolay yolu, ücretsiz bir barındırma sağlayıcısı bulmaktır. günümüzde ücretsiz barındırma sağlayan birçok site var. Uygulamanızı bu ücretsiz sunucularda kolayca barındırabilirsiniz.

Çoğunlukla heroku ve netlify kullanıyorum . bu ücretsiz ve kullanımı kolaydır.


0

Yerel IP'yi (Google Colab'da olduğu için gerçekten öyle değil) halka açık bir IP'ye tünellemek için ngrok kullandım.

Ngrok konsoluna giderken, oluşturulan tüm tünelleri görebiliyorum. Localhost için sadece bir tünel oluşturdum: port ama burada 2 tane var, biri HTTP için diğeri HTTPS için (o kadar hoş değil mi?).

https://i.imgur.com/4v01j7k.png

Web Uygulamamın https adresine gidersem, konsolda görüyorum https://i.imgur.com/5KKak9Y.png

Ancak http adresine gidersem, konsolda https://i.imgur.com/4oFUK1n.png


S: Tünellerden uzaktaki bir makineye HTTP'ye ihtiyaç duyan hizmet çalışanları ile çalışabilir misiniz?

A: Görünüşe göre evet!


Bu kaydın arkasındaki kod (nerede başarısız olduğunu bilmek önemlidir):

// Here we register the SERVICE WORKER
IndexController.prototype._registerServiceWorker = function() { 

    console.log("1.Starting SW function."); 

    if (!navigator.serviceWorker) { 
        console.log("2.Browser is NOT compatible with SW or something is not working."); 
        return; } 

    console.log("2.Browser is compatible with SW.");

    navigator.serviceWorker.register('/sw.js').then(function() {
        console.log('3.Registration worked!');
    }).catch(function() {
        console.log('3.Registration failed!');
    });
};

Daha karmaşık hale getirmek için Service Workers kullanan web uygulamam Colab içinde çalışıyor ( Google Colab ) . Web Uygulaması, Colab içindeki Node.js üzerinde çalışıyor.

Localhost'tan çalışıyorsanız, sizin için daha kolay olacaktır, çünkü localhost'a bağlanırken https gereksinimi uygulanmaz (teoriye göre). [A] ve [B]

https://i.imgur.com/wAAZQFU.png

Bu, tarayıcının Uygulamanızda iyi olmasının aynısı değildir, çünkü localhost üzerinde çalışır.


Not: Yukarıdaki deneyim ..

  • Firefox: aşağıdaki ayarlarla ve bunlar olmadan çalıştı.
  • Chrome: URL'leri beyaz listeye eklemeden ve yeniden başlatmadan

Sahip olduğum https web uygulamasına gidiyorum:

IndexController.js:49 Mixed Content: The page at 'https://0a4e1e0095b0.ngrok.io/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://0a4e1e0095b0.ngrok.io/updates?since=1602934673264&'. This request has been blocked; this endpoint must be available over WSS.
IndexController._openSocket @ IndexController.js:49
IndexController @ IndexController.js:10
(anonymous) @ index.js:16
loadScripts @ loadScripts.js:5
46.../utils/loadScripts @ index.js:15
s @ _prelude.js:1
e @ _prelude.js:1
(anonymous) @ _prelude.js:1
IndexController.js:49 Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
    at IndexController._openSocket (https://0a4e1e0095b0.ngrok.io/js/main.js:2251:12)

Sahip olduğum http web uygulamasına gidiyorum:

Navigated to http://0a4e1e0095b0.ngrok.io/
IndexController.js:17 1.Starting SW function.
IndexController.js:19 2.Browser is NOT compatible with SW or something is not working.

Localhost'ta değilseniz VE https kullanamıyorsanız, tarayıcınızda bu ayarları değiştirmeniz gerekebilir.


Bazıları bunu zaten açıkladı ama işte yine başlıyor.

Krom:

  1. Chrome: // flags / # unsafely-Treat-insecure-origin-as-safe adresine gidin
  2. Beyaz listeye eklemek istediğiniz url'leri ekleyin.
  3. Chrome'u yeniden başlatın

Bunun tüm Chrome pencerelerini yeniden başlatacağını unutmayın . Bu benim için bir çözüm değil çünkü tünellerim her oluşturulduğunda adını değiştiriyor ve her seferinde bir grup pencereyi yeniden başlatamıyorum.

https://i.imgur.com/3n4gMoR.png


Firefox / Waterfox

  1. Geliştirici Araçlarını Aç
  2. Ayarları aç
  3. "Hizmet çalışanlarını HTTP üzerinden etkinleştir (araç kutusu açıkken)" seçeneğini işaretleyin

https://giphy.com/gifs/oA6ZoXqqzdFnxLrZmQ


Firefox / Waterfox Muhtemelen aşağıdaki değişiklikleri yapmanız gerekmiyor, ama yaptım (tarayıcım biraz eski olabilir). Daha fazla bilgi burada .

Hakkında: config

https://i.imgur.com/CjboKnK.png Etkinleştirdim

dom.serviceWorkers.testing.enabled
dom.serviceWorkers.enabled

Bu https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers ve aynı sitedeki ilgili sayfalara bakmanızı şiddetle tavsiye ederim .


Birisi ngrok kurulumuyla ilgileniyorsa, bu çok basittir (python sürümü).

#   Install pyngrok python package on your Google Colab Session
!pip install pyngrok

#    Set up your ngrok Authtoken (requires free registration)
!ngrok authtoken YOUR_TOKEN_HERE


#    Invoke ngrok from Python and start tunneling/connecting
from pyngrok import ngrok 

# Open a HTTP tunnel on the default port 80 if not specified
ngrok_tunnel = ngrok.connect('8888')

# You can print it, or go to the ngrok console on https://dashboard.ngrok.com/status/tunnels
print (ngrok_tunnel.public_url)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.