Żądania HTTP zawierają nagłówki, takie jak User-Agent czy Content-Type. Oprócz nagłówków dołączanych przez przeglądarki aplikacje na Androida mogą dodawać dodatkowe nagłówki, takie jak Cookie lub Referrer, za pomocą dodatku do 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 jest uruchamiana intencja.
Żądania współdzielenia wymagają dodatkowej warstwy zabezpieczeń, ponieważ klient i serwer nie należą do tej samej strony. W tym przewodniku omawiamy wysyłanie takich żądań za pomocą kart niestandardowych w Chrome, czyli intencji uruchamianych 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ął filtrować wszystkie nagłówki pochodzące z innych domen z wyjątkiem tych, które znajdują się na liście dozwolonych, ponieważ nagłówki spoza tej listy stwarzały zagrożenie dla bezpieczeństwa. Od Chrome 86 można dołączać nagłówki spoza listy zatwierdzonych do żądań współdzielenia, gdy serwer i klient są powiązane za pomocą Digital Asset Links. To zachowanie zostało podsumowane w tej tabeli:
| Wersja Chrome | Dozwolone nagłówki CORS |
|---|---|
| przed Chrome 83, | approvelisted, non-approvelisted |
| Chrome w wersji 83–85 | na liście zatwierdzonych |
| od Chrome 86 | approvelisted, non-approvelisted, gdy skonfigurowany jest link do zasobu cyfrowego |
Tabela 1: Filtrowanie nagłówków CORS, które nie znajdują się na liście zatwierdzonych.
Z tego artykułu dowiesz się, jak skonfigurować zweryfikowane połączenie między serwerem a klientem i używać go do wysyłania nagłówków HTTP z listy dozwolonych i spoza niej. Kod znajdziesz w sekcji Dodawanie dodatkowych nagłówków do intencji kart niestandardowych.
Tło
nagłówki żądań CORS z listy dozwolonych a nagłówki żądań CORS spoza tej listy;
Współdzielenie zasobów pomiędzy serwerami z różnych domen (CORS) umożliwia aplikacji internetowej z jednego źródła wysyłanie żądań zasobów z innego źródła. Lista nagłówków CORS-approvelisted jest dostępna w standardzie HTML. Przykładowe nagłówki z listy zatwierdzonych znajdziesz w tabeli poniżej:
| Header | Opis |
|---|---|
| accept-language | reklamuje języki naturalne, które rozumie klient; |
| content-language | opisuje język przeznaczony dla obecnych odbiorców; |
| content-type | wskazuje typ nośnika zasobu, |
Tabela 2. Przykładowe nagłówki CORS z listy zatwierdzonych.
Nagłówki z listy dozwolonych są uważane za bezpieczne, ponieważ nie zawierają wrażliwych informacji o użytkownikach i jest mało prawdopodobne, że spowodują wykonanie przez serwer potencjalnie szkodliwych operacji.
Przykłady nagłówków, które nie znajdują się 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ładowe nagłówki CORS, które nie znajdują się na liście zatwierdzonych.
Dołączanie do żądań CORS nagłówków, które nie znajdują się na liście zatwierdzonych, jest odradzane przez standard HTML, a serwery zakładają, że żądania współdzielenia zawierają tylko nagłówki z tej listy. Wysyłanie nagłówków spoza listy zatwierdzonych z domen pochodzących z innych źródeł umożliwiłoby złośliwym aplikacjom innych firm 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ć transakcje złośliwego serwera, które w inny sposób nie byłyby możliwe.
Dołączanie nagłówków z listy dozwolonych CORS do żądań kart niestandardowych
Karty niestandardowe to specjalny sposób otwierania stron internetowych na dostosowanej karcie przeglądarki. Intencje Custom Tab
można tworzyć za pomocą CustomTabsIntent.Builder(). Możesz też dołączyć nagłówki do tych intencji, używając Bundle z Browser.EXTRA_HEADERS flagą:
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ć nagłówki z listy zatwierdzonych do żądań CORS kart niestandardowych. Chrome domyślnie filtruje jednak nagłówki spoza listy zatwierdzonych. Chociaż inne przeglądarki mogą działać inaczej, deweloperzy powinni oczekiwać, że nagłówki spoza listy zatwierdzonych będą ogólnie blokowane.
Obsługiwany sposób umieszczania w kartach niestandardowych nagłówków, które nie znajdują się na liście zatwierdzonych, polega na wcześniejszym zweryfikowaniu współdzielenia za pomocą linku dostępu cyfrowego. W następnej sekcji dowiesz się, jak skonfigurować i uruchomić intencję kart niestandardowych z wymaganymi nagłówkami.
Dodawanie dodatkowych nagłówków do intencji kart niestandardowych
Konfigurowanie linków do zasobów cyfrowych
Aby umożliwić przekazywanie nagłówków spoza listy zatwierdzonych w intencjach kart niestandardowych, należy skonfigurować link do zasobu cyfrowego między aplikacją na Androida a aplikacją internetową, który potwierdzi, że autor jest właścicielem obu aplikacji.
Aby skonfigurować połączenie z zasobem cyfrowym, 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 pochodzenia.
Tworzenie intencji karty niestandardowej z dodatkowymi nagłówkami
Istnieje kilka sposobów utworzenia intencji kart niestandardowych. Możesz użyć narzędzia dostępnego w androidX, dodając bibliotekę do zależności kompilacji:
implementation 'androidx.browser:browser:1.2.0'
Utwórz intencję i dodaj dodatkowe nagłówki:
CustomTabsIntent constructExtraHeadersIntent(CustomTabsSession session) {
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
// Example non-cors-approvelisted headers.
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
return intent;
}
Konfigurowanie połączenia kart niestandardowych w celu sprawdzenia linku do zasobu
Połączenie kart niestandardowych służy do konfigurowania CustomTabsSession między aplikacją a kartą Chrome. Sesja jest nam potrzebna do sprawdzenia, czy aplikacja i aplikacja internetowa pochodzą z tego samego źródła.
Weryfikacja zakończy się powodzeniem tylko wtedy, gdy linki do zasobów cyfrowych zostały prawidłowo skonfigurowane.
Zachęcamy do dzwonienia pod numer CustomTabsClient.warmup(). Umożliwia to wstępne zainicjowanie aplikacji przeglądarki w tle i przyspieszenie procesu otwierania adresu URL.
// Set up a connection that warms up and validates a session.
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(@NonNull ComponentName name,
@NonNull CustomTabsClient client) {
// Create session after service connected.
mSession = client.newSession(callback);
client.warmup(0);
// Validate the session as the same origin to allow cross origin headers.
mSession.validateRelationship(CustomTabsService.RELATION_USE_AS_ORIGIN,
Uri.parse(url), null);
}
@Override
public void onServiceDisconnected(ComponentName componentName) { }
};
Konfigurowanie wywołania zwrotnego, które uruchamia intencję po weryfikacji
Do sesji przekazano wartość CustomTabsCallback. Konfigurujemy go tak, aby po pomyślnej weryfikacji źródła uruchamiał utworzoną wcześniej CustomTabsIntentonRelationshipValidationResult().
// Set up a callback that launches the intent after session validated.
CustomTabsCallback callback = new CustomTabsCallback() {
@Override
public void onRelationshipValidationResult(int relation, @NonNull Uri requestedOrigin,
boolean result, @Nullable Bundle extras) {
// Launch custom tabs intent after session was validated as the same origin.
CustomTabsIntent intent = constructExtraHeadersIntent(mSession);
intent.launchUrl(MainActivity.this, Uri.parse(url));
}
};
Tworzenie powiązania z połączeniem usługi kart niestandardowych
Powiązanie usługi uruchamia ją, a metoda onCustomTabsServiceConnected() połączenia zostanie wywołana w odpowiednim czasie. Nie zapomnij odpowiednio odłączyć usługi. Wiązanie i odwiązywanie jest 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 pokazujemy, jak dodawać dowolne nagłówki do żądań CORS kart niestandardowych. Zatwierdzone nagłówki można dołączać do każdego żądania CORS kart niestandardowych. Nagłówki spoza listy zatwierdzonych są zwykle uznawane za niebezpieczne w przypadku żądań CORS i Chrome domyślnie je filtruje. Dołączanie ich jest dozwolone tylko w przypadku klientów i serwerów tego samego pochodzenia, zweryfikowanych za pomocą linku do zasobu cyfrowego.