Dodaj dodatkowe nagłówki żądań HTTP

Żądania HTTP zawierają nagłówki takie jak User-Agent lub Content-Type. Oprócz nagłówków dołączanych przez przeglądarki aplikacje na Androida mogą dodawać dodatkowe nagłówki, na przykład plik cookie czy stronę odsyłającą przez intencję EXTRA_HEADERS. Ze względów bezpieczeństwa Chrome odfiltrowuje niektóre dodatkowe nagłówki w zależności od tego, jak i gdzie uruchomiono intencję.

Żądania z innych domen wymagają dodatkowej warstwy zabezpieczeń, ponieważ klient i serwer nie są własnością tej samej strony. W tym przewodniku omawiamy uruchamianie takich żądań za pomocą kart niestandardowych Chrome, tj. intencji uruchamianych z aplikacji, które otwierają adres URL na karcie przeglądarki. Do Chrome 83 deweloperzy mogli dodawać dowolne nagłówki podczas uruchamiania karty niestandardowej. Od wersji 83 Chrome zaczyna filtrować wszystkie oprócz zatwierdzonych nagłówków z innych domen, ponieważ niezatwierdzone nagłówki mogą stanowić zagrożenie dla bezpieczeństwa. Począwszy od Chrome 86 można dołączać niezatwierdzone nagłówki do żądań z innych domen, jeśli serwer i klient są ze sobą powiązani za pomocą linku do zasobów cyfrowych. Podsumowanie tego zachowania znajduje się w tej tabeli:

Wersja Chrome Dozwolone nagłówki CORS
przed Chrome 83 zatwierdzona, niezatwierdzona
Od Chrome 83 do Chrome 85 zatwierdzono
od Chrome 86 zatwierdzone, niezatwierdzone, gdy skonfigurowano link do zasobów cyfrowych;

Tabela 1. Filtrowanie niezatwierdzonych nagłówków CORS.

Z tego artykułu dowiesz się, jak skonfigurować zweryfikowane połączenie między serwerem a klientem i używać go do wysyłania zatwierdzonych i niezatwierdzonych nagłówków http. W przypadku kodu możesz przejść do sekcji Dodawanie dodatkowych nagłówków do intencji karty niestandardowej.

Wprowadzenie

zatwierdzone i niezatwierdzone – nagłówki żądań CORS;

Udostępnianie zasobów między serwerami (CORS) umożliwia aplikacji internetowej z jednego źródła żądania zasobów innego źródła. Lista nagłówków zatwierdzonych przez CORS znajduje się w standardzie HTML. Przykładowe nagłówki z listy zatwierdzonych zostały przedstawione w następnej tabeli:

Header Opis
Akceptuj język reklamuje języki naturalne, które klient rozumie
język treści opisuje język przeznaczony dla obecnych odbiorców;
typ treści wskazuje typ nośnika zasobu

Tabela 2. Przykładowe zatwierdzone nagłówki CORS.

Nagłówki zatwierdzone na liście są uznawane za bezpieczne, ponieważ nie zawierają poufnych informacji o użytkowniku i raczej nie spowodują, że serwer przeprowadzi potencjalnie szkodliwe operacje.

Przykłady niezatwierdzonych nagłówków znajdziesz w tej tabeli:

Header Opis
token okaziciela uwierzytelnia klienta na serwerze
pochodzenie : origin wskazuje źródło żądania
ciastko zawiera pliki cookie ustawione przez serwer

Tabela 3. Przykładowe niezatwierdzone nagłówki CORS.

Standard HTML nie zaleca dołączania niezatwierdzonych nagłówków do żądań CORS, a serwery zakładają, że żądania z innych domen zawierają tylko zatwierdzone nagłówki. Wysyłanie niezatwierdzonych nagłówków z domen z innych domen pozwoliłoby złośliwym aplikacjom innych firm na tworzenie nagłówków, które niewłaściwie wykorzystują pliki cookie użytkownika przechowywane przez Chrome (lub inną przeglądarkę) i dołączane do żądań. Pliki cookie mogą uwierzytelniać złośliwe transakcje serwerowe, które w innym przypadku nie byłyby możliwe.

Dołączając nagłówki zatwierdzone przez CORS do żądań kart niestandardowych

Karty niestandardowe to specjalny sposób, w jaki możesz otwierać strony internetowe na spersonalizowanej karcie przeglądarki. Zamiary karty niestandardowej można tworzyć za pomocą CustomTabsIntent.Builder(). Nagłówki możesz też dołączać do intencji, korzystając z elementu Bundle z flagą 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łączać zatwierdzone nagłówki do żądań CORS dotyczących kart niestandardowych. Jednak Chrome domyślnie filtruje nagłówki, które nie znajdują się na liście zatwierdzonych. Chociaż inne przeglądarki mogą działać inaczej, programiści powinni oczekiwać, że niezatwierdzone nagłówki będą ogólnie blokowane.

Obsługiwanym sposobem uwzględniania niezatwierdzonych nagłówków w kartach niestandardowych jest najpierw zweryfikowanie połączenia między domenami za pomocą cyfrowego linku dostępu. W następnej sekcji pokażemy, jak je skonfigurować i uruchomić intencję kart niestandardowych z wymaganymi nagłówkami.

Dodawanie dodatkowych nagłówków do intencji na kartach niestandardowych

Aby umożliwić przekazywanie niezatwierdzonych nagłówków przez intencje karty niestandardowej, trzeba skonfigurować połączenie zasobów cyfrowych między aplikacją na Androida a aplikacją internetową, która będzie sprawdzać, czy autor jest właścicielem obu aplikacji.

Aby skonfigurować link do zasobów cyfrowych, postępuj zgodnie z oficjalnym przewodnikiem. W przypadku relacji link użyj atrybutu „delegate_permission/common.use_as_origin”, który wskazuje, że po zweryfikowaniu linku obie aplikacje należą do tej samej źródła.

Utwórz niestandardową intencję dotyczącą kart z dodatkowymi nagłówkami

Intencje dotyczące kart niestandardowych można utworzyć na kilka sposobów. Możesz użyć kreatora dostępnego w Androidzie X, dodając bibliotekę do zależności kompilacji:

MULTI_LINE_CODE_PLACEHOLDER_1

Utwórz intencję i dodaj nagłówki:

MULTI_LINE_CODE_PLACEHOLDER_2

Połączenie z kartami niestandardowymi służy do konfigurowania elementu CustomTabsSession między aplikacją a kartą Chrome. Sesja jest potrzebna do zweryfikowania, czy aplikacja i aplikacja internetowa należą do tego samego źródła. Weryfikacja przebiega tylko wtedy, gdy linki do zasobów cyfrowych są prawidłowo skonfigurowane.

Zachęcamy do kontaktu telefonicznego z firmą CustomTabsClient.warmup(). Pozwala aplikacji przeglądarki na wstępne inicjowanie w tle i przyspieszenie procesu otwierania adresu URL.

MULTI_LINE_CODE_PLACEHOLDER_3

Skonfiguruj wywołanie zwrotne, które uruchamia intencję po walidacji

Element CustomTabsCallback został przekazany do sesji. Skonfigurowaliśmy onRelationshipValidationResult() w taki sposób, aby po pomyślnym zakończeniu weryfikacji źródła uruchomiono wcześniej utworzony CustomTabsIntent.

MULTI_LINE_CODE_PLACEHOLDER_4

Powiązanie połączenia z usługą kart niestandardowych

Powiązanie usługi spowoduje uruchomienie usługi i w końcu zostanie wywołany onCustomTabsServiceConnected() połączenia. Nie zapomnij odpowiednio usunąć powiązania usługi. Powiązanie i usunięcie powiązania zwykle wykonuje się 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. W repozytorium android-browser-helper na GitHubie znajdziesz przykładową aplikację.

Podsumowanie

Ten przewodnik pokazuje, jak dodawać nagłówki do niestandardowych kart do żądań CORS. Zatwierdzone nagłówki można dołączyć do każdego niestandardowego żądania CORS z kart. Nagłówki, których nie ma na liście, są zwykle 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, które zostały zweryfikowane za pomocą linku do zasobów cyfrowych.