Żądania HTTP zawierają nagłówki takie jak User-Agent czy Content-Type. Oprócz nagłówków dołączonych przez przeglądarki aplikacje na Androida mogą dodawać dodatkowe nagłówki, takie jak Cookie lub Odsyłacz, za pomocą dodatku do danych o intencji EXTRA_HEADERS
. Ze względów bezpieczeństwa Chrome filtruje niektóre dodatkowe nagłówki w zależności od tego, jak i gdzie uruchamiana jest intencja.
Żądania między domenami wymagają dodatkowego poziomu zabezpieczeń, ponieważ klient i serwer nie należą do tej samej strony. W tym przewodniku omówiono uruchamianie takich żądań na kartach niestandardowych w Chrome, czyli intencje uruchamiane z aplikacji, które otwierają adres URL na karcie przeglądarki. Do wersji Chrome 83 deweloperzy mogli dodawać dowolne nagłówki podczas uruchamiania karty niestandardowej. Od wersji 83 Chrome zaczęło filtrować wszystkie nagłówki między domenami z wyjątkiem zatwierdzonych, ponieważ nagłówki, które nie zostały zatwierdzone, stanowiły zagrożenie dla bezpieczeństwa. Począwszy od wersji 86 przeglądarki Chrome można dołączać nagłówki niewymagające zatwierdzenia do żądań między domenami, gdy serwer i klient są powiązane za pomocą linku do zasobu cyfrowego. Zachowanie to zostało opisane w tabeli poniżej:
Wersja Chrome | Dozwolone nagłówki CORS |
---|---|
przed wersją Chrome 83, | zatwierdzona, niezatwierdzona |
Od Chrome 83 do Chrome 85 | approvelisted |
od wersji Chrome 86, | approvelisted, non-approvelisted, gdy skonfigurowano link do zasobu cyfrowego |
Tabela 1. Filtrowanie nagłówków CORS, które nie są na liście zatwierdzonych.
Z tego artykułu dowiesz się, jak skonfigurować uwierzytelnione połączenie między serwerem a klientem i wykorzystywać je do wysyłania nagłówków HTTP z listy zatwierdzonych i niezatwierdzonych. Aby dowiedzieć się, jak wygląda kod, przejdź do sekcji Dodawanie dodatkowych nagłówków do intencji na karcie niestandardowej.
Tło
Nagłówki żądań CORS z listy zatwierdzonych i niezatwierdzonych
Cross-Origin Resource Sharing (CORS) umożliwia aplikacji internetowej z jednego źródła wysyłanie żądań do zasobów z innego źródła. Lista zatwierdzonych nagłówków CORS jest dostępna w standardzie HTML. Przykłady nagłówków z listy zatwierdzonych znajdziesz w następującej tabeli:
Header | Opis |
---|---|
accept-language | reklamuje języki naturalne zrozumiałe dla klienta; |
content-language | opisuje język przeznaczony dla obecnych odbiorców. |
content-type | wskazuje typ nośnika zasobu, |
Tabela 2. Przykład nagłówków CORS na liście zatwierdzonych
Nagłówki z zatwierdzonymi listami są uważane za bezpieczne, ponieważ nie zawierają poufnych informacji o użytkownikach i prawdopodobnie nie spowodują, że serwer wykona potencjalnie szkodliwe operacje.
Przykłady nagłówków, które nie są na liście zatwierdzonych, znajdziesz w tabeli poniżej:
Header | Opis |
---|---|
bearer-token | uwierzytelnia klienta na serwerze, |
pochodzenie | wskazuje źródło żądania |
ciastko | zawiera pliki cookie ustawione przez serwer; |
Tabela 3. Przykład nagłówków CORS, które nie są na liście zatwierdzonych.
Standard HTML zaleca, aby nie dołączać do żądań CORS nagłówków, które nie są wymienione na liście zatwierdzonych, a serwery zakładają, że żądania między domenami zawierają tylko nagłówki z listy zatwierdzonych. Wysyłanie nagłówków, które nie są na liście zatwierdzonych, z domen w różnych domenach, pozwoliłoby złośliwym aplikacjom innych firm na tworzenie nagłówków, które nadużywają plików cookie użytkownika, które Chrome (lub inna przeglądarka) przechowuje i dołącza do żądań. Pliki cookie mogły uwierzytelniać złośliwe transakcje serwera, co w innym przypadku nie byłoby możliwe.
Dołączanie nagłówków z listy zatwierdzonych nagłówków CORS do żądań w ramach kart niestandardowych
Karty niestandardowe to specjalny sposób uruchamiania stron internetowych na niestandardowej karcie przeglądarki. Intencje karty niestandardowej można tworzyć za pomocą CustomTabsIntent.Builder()
. Możesz też dołączyć nagłówki do tych intencji, używając Bundle
z oznaczeniem Browser.EXTRA_HEADERS
:
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));
Zawsze możemy dołączyć zatwierdzone nagłówki do żądań CORS w kartach niestandardowych. Jednak domyślnie Chrome odfiltrowuje nagłówki, które nie są na liście zatwierdzonych. Chociaż inne przeglądarki mogą działać inaczej, deweloperzy powinni się spodziewać, że nagłówki, które nie są na liście zatwierdzonych, będą ogólnie blokowane.
Obsługiwany sposób uwzględniania nagłówków nieobjętych listą zatwierdzonych w kartach niestandardowych polega na uprzedniej weryfikacji połączenia między domenami za pomocą linku dostępu cyfrowego. W następnej sekcji opisujemy, jak je skonfigurować i uruchomić intent Custom Tabs z wymaganymi nagłówkami.
Dodawanie dodatkowych nagłówków do niestandardowych intencji na karcie
Konfigurowanie linków do zasobów cyfrowych
Aby umożliwić przekazywanie nagłówków, które nie są na liście zatwierdzonych, przez intencje karty niestandardowej, konieczne jest skonfigurowanie połączenia zasobów cyfrowych między aplikacją na Androida a aplikacją internetową, które potwierdzi, że autor jest właścicielem obu aplikacji.
Aby skonfigurować link do zasobu cyfrowego, postępuj zgodnie z oficjalnym przewodnikiem. W przypadku relacji linku użyj wartości „delegate_permission/common.use_as_origin”, która wskazuje, że po zweryfikowaniu linku obie aplikacje należą do tego samego źródła.
Tworzenie niestandardowej karty intencji z dodatkowymi nagłówkami
Intencje kart niestandardowych można tworzyć na kilka sposobów. Możesz użyć kreatora dostępnego w androidX, dodając bibliotekę do zależności kompilacji:
MULTI_LINE_CODE_PLACEHOLDER_1
Utwórz intencję i dodaj dodatkowe nagłówki:
MULTI_LINE_CODE_PLACEHOLDER_2
Konfigurowanie połączenia z kartami niestandardowymi w celu weryfikacji linku zasobu
Połączenie z kartami niestandardowymi służy do konfigurowania CustomTabsSession
między aplikacją a kartą Chrome. Potrzebujemy tej sesji, aby sprawdzić, czy aplikacja i aplikacja internetowa należą do tego samego źródła.
Weryfikacja powiedzie się tylko wtedy, gdy linki do zasobów cyfrowych zostały prawidłowo skonfigurowane.
Zachęcamy do zadzwonienia pod numer CustomTabsClient.warmup()
. Umożliwia to aplikacji przeglądarki wstępną inicjalizację w tle i przyspieszenie procesu otwierania adresu URL.
MULTI_LINE_CODE_PLACEHOLDER_3
Konfigurowanie wywołania zwrotnego, które uruchamia intent po weryfikacji
Wartość CustomTabsCallback
została przekazana do sesji. Po pomyślnej weryfikacji pochodzenia skonfigurujemy onRelationshipValidationResult()
tak, aby uruchamiał wcześniej utworzony CustomTabsIntent
.
MULTI_LINE_CODE_PLACEHOLDER_4
Połącz połączenie z usługą kart niestandardowych
Powiązanie usługi powoduje jej uruchomienie, a w efekcie połączenia onCustomTabsServiceConnected()
zostanie wywołane. Pamiętaj, aby odpowiednio odłączyć usługę. Wiązanie i rozwiązywanie są zwykle wykonywane w metodach cyklu życia aktywności onStart()
i onStop()
.
// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
CustomTabsClient.getPackageName(MainActivity.this, null), connection);
// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);
Kod aplikacji demonstracyjnej
Więcej informacji o usłudze kart niestandardowych znajdziesz tutaj. Przykład działającej aplikacji znajdziesz w repozytorium GitHub android-browser-helper.
Podsumowanie
W tym przewodniku pokazano, jak dodawać dowolne nagłówki do żądań CORS w kartach niestandardowych. Każde żądanie CORS w kartach niestandardowych może zawierać nagłówki z listy zatwierdzonych nagłówków. Nagłówki, które nie są na liście zatwierdzonych nagłówków, są ogólnie uznawane za niebezpieczne w żądaniach CORS, a Chrome domyślnie je odfiltrowuje. Ich dołączanie jest dozwolone tylko w przypadku klientów i serwerów z tego samego źródła, które zostały zweryfikowane za pomocą linku do zasobu cyfrowego.