Żą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, np. „Cookie” lub „ Referrer”, za pomocą dodatkowej 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. | lista zatwierdzonych, niezatwierdzona |
Od Chrome 83 do Chrome 85 | lista zatwierdzonych |
od wersji 86 Chrome. | 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ć zweryfikowane połączenie między serwerem a klientem oraz użyć go do wysyłania nagłówków HTTP z listy zatwierdzonych i niezaakceptowanych. Aby dowiedzieć się, jak wygląda kod, przejdź do sekcji Dodawanie dodatkowych nagłówków do intencji kart niestandardowych.
Tło
zatwierdzone i niezatwierdzone nagłówki żądań CORS
Udostępnianie zasobów między pochodzeniem (CORS) umożliwia aplikacji internetowej z jednego źródła żądanie 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 podano 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. |
typ treści | wskazuje typ nośnika zasobu, |
Tabela 2. Przykład nagłówków CORS z listy zatwierdzonych nagłówków.
Nagłówki znajdujące się na liście zatwierdzonych są uważane za bezpieczne, ponieważ nie zawierają poufnych informacji o użytkowniku i mało prawdopodobne jest wykonanie przez serwer potencjalnie szkodliwych operacji.
Przykłady nagłówków, które nie są na liście zatwierdzonych, podano w tabeli:
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 wcześniejszym zweryfikowaniu połączenia między domenami za pomocą linku do cyfrowego dostępu. W następnej sekcji pokazujemy, jak je skonfigurować i uruchomić intencję dotyczącą kart niestandardowych z wymaganymi nagłówkami.
Dodawanie dodatkowych nagłówków do intencji związanych z kartami niestandardowymi
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 zasobu cyfrowego 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 z linkami użyj wartości „delegate_permission/common.use_as_origin”, co oznacza, że po zweryfikowaniu linku obie aplikacje należą do tego samego źródła.
Utwórz intencję niestandardową z dodatkowymi nagłówkami
Istnieje wiele sposobów tworzenia intencji dotyczących kart niestandardowych. 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 jest używane do konfigurowania CustomTabsSession
między aplikacją a kartą Chrome. Potrzebujemy sesji, aby sprawdzić, czy aplikacja i aplikacja internetowa należą do tego samego źródła.
Weryfikacja przebiega pomyślnie tylko wtedy, gdy linki do zasobów cyfrowych zostały prawidłowo skonfigurowane.
Zachęcamy do zadzwonienia pod numer CustomTabsClient.warmup()
. Pozwala aplikacji przeglądarki na wstępne inicjowanie w tle i przyspiesza proces otwierania adresu URL.
MULTI_LINE_CODE_PLACEHOLDER_3
Skonfiguruj wywołanie zwrotne, które po weryfikacji uruchamia intencję
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 powoduje uruchomienie usługi, a w końcu wywołanie onCustomTabsServiceConnected()
połączenia. 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. Można je dołączać tylko w przypadku klientów i serwerów tego samego pochodzenia, zweryfikowanych za pomocą linku do zasobu cyfrowego.