Důležité: Pokud pracujete s platformou Google Cloud Platform a neplánujete si vybudovat vlastní klientskou knihovnu, používejte servisní účty a cloudovou klientskou knihovnu namísto provádění autorizace výslovně, jak je popsáno v tomto dokumentu. Další informace najdete v tématu Přehled ověřování v dokumentaci k platformě Google Cloud Platform. S některými rozhraními Google API můžete provádět autorizovaná volání API pomocí podepsaného JWT namísto použití OAuth 2.0, což vám může ušetřit síťový požadavek. Vidět
Systém Google OAuth 2.0 podporuje interakce server-to-server, jako jsou interakce mezi webovou aplikací a službou Google. Pro tento scénář potřebujete servisní účet, což je účet, který patří vaší aplikaci, nikoli jednotlivému koncovému uživateli. Vaše aplikace volá rozhraní Google API jménem servisního účtu, takže uživatelé nejsou přímo zapojeni. Tento scénář se někdy nazývá „dvoustranný protokol OAuth“ nebo „2LO“. (Související termín „třínohý protokol OAuth“ označuje scénáře, ve kterých vaše aplikace volá rozhraní Google API jménem koncových uživatelů a kdy je někdy vyžadován souhlas uživatele.)
Aplikace obvykle používá účet služby, když aplikace používá rozhraní Google API pro práci se svými vlastními daty, nikoli s daty uživatele. Například aplikace, která používá Google Cloud Datastore k uchování dat, by použila servisní účet k ověření svých volání do Google Cloud Datastore API.
Administrátoři domény Google Workspace mohou také servisním účtům udělit oprávnění k přístupu k uživatelským datům jménem uživatelů v doméně v celé doméně.
Tento dokument popisuje, jak může aplikace dokončit proces OAuth 2.0 mezi servery pomocí klientské knihovny Google API (doporučeno) nebo HTTP.
Dodatek: Autorizace servisního účtu bez OAuth.Chcete-li podporovat interakce server-to-server, nejprve vytvořte účet služby pro svůj projekt v konzole API. Pokud chcete mít přístup k uživatelským datům uživatelů ve vašem účtu Google Workspace, delegujte přístup pro celou doménu servisnímu účtu.
Vaše aplikace se poté připraví na autorizovaná volání API pomocí přihlašovacích údajů servisního účtu k vyžádání přístupového tokenu ze serveru OAuth 2.0 auth.
Vaše aplikace může nakonec použít přístupový token k volání rozhraní Google API.
Doporučení: Vaše aplikace může tyto úkoly dokončit buď pomocí klientské knihovny Google API pro váš jazyk, nebo přímou interakcí se systémem OAuth 2.0 pomocí HTTP. Mechanika autentizačních interakcí server-to-server však vyžaduje, aby aplikace vytvářely a kryptograficky podepisovaly JSON Web Tokeny (JWT), a je snadné udělat vážné chyby, které mohou mít vážný dopad na bezpečnost vaší aplikace.
Z tohoto důvodu vám důrazně doporučujeme používat knihovny, jako jsou klientské knihovny rozhraní Google API, které abstrahují kryptografii z kódu vaší aplikace.
Pověřovací údaje servisního účtu zahrnují vygenerovanou e-mailovou adresu, která je jedinečná, a alespoň jeden pár veřejného/soukromého klíče. Pokud je povoleno delegování v rámci celé domény, je ID klienta také součástí přihlašovacích údajů servisního účtu.
Pokud vaše aplikace běží na Google App Engine, při vytváření projektu se automaticky nastaví servisní účet.
Pokud vaše aplikace běží na Google Compute Engine, automaticky se při vytváření projektu nastaví také servisní účet, ale musíte určit rozsahy, ke kterým vaše aplikace potřebuje při vytváření instance Google Compute Engine přístup. Další informace najdete v tématu Příprava instance pro použití servisních účtů.
Pokud vaše aplikace neběží na Google App Engine nebo Google Compute Engine, musíte tyto přihlašovací údaje získat v konzole Google API. Chcete-li vygenerovat přihlašovací údaje servisního účtu nebo zobrazit veřejné přihlašovací údaje, které jste již vygenerovali, postupujte takto:
Otevřete stránku Účty služeb. Pokud budete vyzváni, vyberte projekt nebo vytvořte nový. Klikněte na tlačítko Přidat Vytvořit účet služby. V části Podrobnosti účtu služby zadejte název, ID a popis účtu služby a poté klikněte na možnost Vytvořit. Volitelné: V části Služba oprávnění účtu, vyberte role IAM, které chcete udělit servisnímu účtu, a poté klikněte na Pokračovat.Volitelně: V části Udělit uživatelům přístup k tomuto účtu služby přidejte uživatele nebo skupiny, kterým je povoleno používat a spravovat účet služby.Klikněte na přidat klíč Vytvořit a poté clickCreate.Vygeneruje se váš nový pár veřejného/soukromého klíče a stáhne se do vašeho počítače; slouží jako jediná kopie soukromého klíče. Jste odpovědní za jeho bezpečné uložení. Pokud tento pár klíčů ztratíte, budete si muset vygenerovat nový.
Pokud potřebujete servisnímu účtu udělit oprávnění pro celou doménu G Suite, klikněte na e-mailovou adresu servisního účtu, který jste vytvořili, a zkopírujte hodnotu z pole Jedinečné ID.
Chcete-li delegovat oprávnění servisnímu účtu, použijte hodnotu, kterou jste zkopírovali, jako ID klienta.
Do konzole API se můžete kdykoli vrátit a zobrazit e-mailovou adresu, otisky veřejného klíče a další informace nebo vygenerovat další páry veřejného/soukromého klíče. Další podrobnosti o přihlašovacích údajích účtu služby v konzole API najdete v tématu Účty služeb v souboru nápovědy konzoly API.
Poznamenejte si e-mailovou adresu servisního účtu a uložte soubor soukromého klíče servisního účtu na místo dostupné pro vaši aplikaci. Vaše aplikace je potřebuje k provádění autorizovaných volání API.
Poznámka: Soukromé klíče musíte bezpečně ukládat a spravovat ve vývojovém i produkčním prostředí. Google neuchovává kopii vašich soukromých klíčů, pouze vaše veřejné klíče. Další informace najdete v části Bezpečně zacházet s přihlašovacími údaji klienta v zásadách OAuth 2.0.Pokud máte účet Google Workspace, administrátor organizace může autorizovat aplikaci pro přístup k uživatelským datům jménem uživatelů v doméně Google Workspace. Například aplikace, která používá Google Calendar API k přidávání událostí do kalendářů všech uživatelů v doméně Google Workspace, by používala servisní účet pro přístup k Google Calendar API jménem uživatelů. Autorizace servisního účtu pro přístup k datům jménem uživatelů v doméně se někdy nazývá „delegování oprávnění pro celou doménu“ servisnímu účtu.
Chcete-li delegovat oprávnění pro celou doménu na účet služby, nejprve povolte delegování v rámci celé domény pro existující účet služby na stránce Servisní účty nebo vytvořte nový účet služby s povoleným delegováním pro celou doménu.
Superadministrátor domény Google Workspace pak musí provést následující kroky:
V administrátorské konzoli vaší domény Google Workspace přejděte do nabídky Hlavní nabídka > Zabezpečení > Ovládací prvky rozhraní API. V podokně delegování pro celou doménu vyberte možnost Spravovat delegování v rámci celé domény. Klepněte na tlačítko Přidat nový. Do pole ID klienta zadejte ID klienta účtu služby. ID klienta svého servisního účtu najdete na stránce Servisní účty. Do pole Rozsahy OAuth (oddělené čárkami) zadejte seznam rozsahů, ke kterým má být vaší aplikaci udělen přístup. Pokud například vaše aplikace potřebuje úplný přístup k rozhraní Google Drive API a Google Calendar API v celé doméně, zadejte: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth /calendar.Click Authorize.Poznámka: Po přidání ID klienta obvykle trvá několik minut, než bude udělen přístup k předstírání jiné identity, ale v některých případech může trvat až 24 hodin, než se projeví všem uživatelům vašeho účtu Google.< p>Vaše aplikace má nyní oprávnění provádět volání API jako uživatelé ve vaší doméně (k "vydávání" uživatelů). Když se připravujete na autorizovaná volání API, určíte uživatele, který se má zosobnit.import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;import com.google.api.services.sqladmin.SQLAdminScopes;// . ..GoogleCredential Credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")) .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));GoogleCredential Credential = GoogleCredential.fromStream(json"2MyProject-1234.json.4am) ")) .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN)).createDelegated("user@example.com"); Vytvořte objekt Credentials z přihlašovacích údajů servisního účtu a oborů, ke kterým vaše aplikace potřebuje přístup. Například: from google.oauth2 import service_accountSCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']SERVICE_ACCOUNT_FILE = '/path/to/service.json'credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE , rozsahy=SCOPES)
Pokud vyvíjíte aplikaci na platformě Google Cloud Platform, můžete místo toho použít výchozí přihlašovací údaje aplikace, což může proces zjednodušit.
Delegování oprávnění pro celou doménuPokud jste účtu služby delegovali přístup pro celou doménu a chcete se vydávat za uživatelský účet, použijte metodu with_subject existujícího objektu ServiceAccountCredentials. Například:
delegovane_povereni = credentials.with_subject('user@example.org')Doporučení: Přestože vaše aplikace může dokončit tyto úkoly přímou interakcí se systémem OAuth 2.0 pomocí HTTP, mechanika autentizačních interakcí server-to-server vyžaduje, aby aplikace vytvářely a kryptograficky podepisovaly JSON Web Tokens (JWT), a je to snadné. dělat vážné chyby, které mohou mít vážný dopad na bezpečnost vaší aplikace.
Z tohoto důvodu vám důrazně doporučujeme používat knihovny, jako jsou klientské knihovny rozhraní Google API, které abstrahují kryptografii z kódu vaší aplikace.
Vytvořte webový token JSON (JWT, vyslovováno jako „jot“), který obsahuje záhlaví, sadu nároků a podpis. Požádejte o přístupový token z autorizačního serveru Google OAuth 2.0. Zpracujte odpověď JSON, kterou autorizační server vrátí.{101} Zakódovaná hlavička Base64url}.{Base64url zakódovaná sada nároků}.{Base64url zakódovaný podpis}{Base64url zakódovaná hlavička}.{Base64url zakódovaná sada nároků}{"alg":"RS256","typ":"JWT"}eyJhbGciOiJSUdJCI15NiViI p>Deskriptor zamýšleného cíle tvrzení. Při požadavku na přístupový token je tato hodnota vždy https://oauth2.googleapis.com/token.{ "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope": "https://www.googleapis.com/auth/devstorage.read_only", "aud": "2.https://oauth" googleapis.com/token", "exp": 1328554385, "iat": 1328550785}{ "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.g"comusaccount",.com", "suble.g"":.com",. "scope": "https://www.googleapis.com/auth/prediction", "aud": "https://oauth2.googleapis.com/token", "exp": 1328554385, "iat": 1328550785} { "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope": "https://www.googleapis.com/auth/prediction", "aud": "https://oauth2.googleapis. com/token", "exp": 1328554385, "iat": 1328550785}{Base64url zakódovaná hlavička}.{Base64url zakódovaná sada nároků}{Base64url zakódovaná hlavička}.{Base64url zakódovaná sada nároků}.{Base64url encoded signature}{"url zakódovaná sada ":"RS256","typ":"JWT"}."iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com","scope":"https://www.googleapis.com/auth/prediction ","aud":"https://oauth2.googleapis.com/token","exp":1328554385,"iat":1328550785}.[byty podpisu]eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eViwJpcj9.eViyM GpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd2b9dv3VLm HJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NS912AW.WF0I 4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5quCTAJkIgIyp4uCTAJkIgIyp4 s7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZLks_HMpztZt0soF5KS66FiFiObHt7 WJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ https ://oauth2.googleapis.com/token NameDescription grant_typePoužijte následující řetězec, podle potřeby zakódovaný do adresy URL: urn:ietf:params:oauth:grant-type:jwt-bearer
POST /token HTTP/1.1Host: oauth2.googleapis.comContent-Type: application/x-www-form-urlencodedgrant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertionGInskOVcJhIb I9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb20zi9d8jh d3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL39bi20hM4m MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS- l rant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJYb3NjgpsHJV4M Gc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsYcHGd2lgGvl sImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4xNTY-Wyn3Rhgwg hrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQTXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7MCYtWadjk sU' https://oauth2.googleapis.com/token { "access_token ": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M", "scope": "https://www.googleapis.com/auth/prediction" "token_type": "Bearer", "expires_in": 3600}Vytvořte objekt služby pro rozhraní API, které chcete volat pomocí objektu GoogleCredential. Například: SQLAdmin sqladmin = new SQLAdmin.Builder(httpTransport, JSON_FACTORY, pověření).build();Zadávejte požadavky na službu API pomocí rozhraní poskytovaného objektem služby. Chcete-li například vypsat seznam instancí databází Cloud SQL v projektu vzrušující-example-123: SQLAdmin.Instances.List instance = sqladmin.instances().list("exciting-example-123").execute(); Sestavte objekt služby pro rozhraní API, které chcete volat. Objekt služby vytvoříte voláním funkce sestavení s názvem a verzí rozhraní API a objektem authorCredentials. Chcete-li například volat verzi 1beta3 rozhraní Cloud SQL Administration API:import googleapiclient.discoverysqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)Zadávejte požadavky na službu API pomocí rozhraní poskytovaného službou. objekt. Chcete-li například vypsat seznam instancí cloudových databází SQL ve vzrušujícím-example-123 project:response = sqladmin.instances().list(project='exciting-example-123').execute() GET /drive/v2/ soubory HTTP/1.1Host: www.googleapis.comAuthorization: Bearer access_tokenGET https://www.googleapis.com/drive/v2/files?access_token=access_tokencurl -H "Authorization: Beareraccess_token" https://www.googleapis.com/ drive/v2/filescurl https://www.googleapis.com/drive/v2/files?access_token=access_token
Pokud se pokoušíte použít delegování v rámci celé domény, servisní účet není autorizován v administrátorské konzoli uživatele doména.
Zkontrolujte, zda je účet služby autorizován na stránce delegování pro celou doménu v administrátorské konzoli pro uživatele ve vedlejším nároku (pole).
I když to obvykle trvá několik minut, může trvat až 24 hodin, než se autorizace rozšíří mezi všechny uživatele ve vašem účtu Google.
Neautorizovaný_klientClient nemá oprávnění získat přístupové tokeny pomocí této metody nebo klient nemá oprávnění pro žádný z požadovaných rozsahů.Účet služby byl autorizován pomocí e-mailové adresy klienta, nikoli pomocí ID klienta (číselného) v administrátorské konzoli.
Na stránce delegování pro celou doménu v administrátorské konzoli odeberte klienta a znovu jej přidejte s číselným ID.
access_denied(jakákoli hodnota)
Pokud používáte delegování v rámci celé domény, jeden nebo více požadovaných rozsahů není v administrátorské konzoli autorizováno.
Ujistěte se, že je servisní účet autorizován na stránce delegování v rámci celé domény v administrátorské konzoli pro uživatele v dílčím nároku (pole) a že zahrnuje všechny rozsahy, které požadujete v nároku na rozsah vašeho JWT .
I když to obvykle trvá několik minut, může trvat až 24 hodin, než se autorizace rozšíří mezi všechny uživatele ve vašem účtu Google.
invalid_grantNení platný e-mail.Uživatel neexistuje.
Zkontrolujte, zda je e-mailová adresa v dílčím nároku (pole) správná.
invalid_grantNeplatný JWT: Token musí být krátkodobý (60 minut) a v přiměřeném časovém rámci. Zkontrolujte své hodnoty 'iat' a 'exp' a použijte hodiny se zkreslením, abyste zohlednili rozdíly v taktu mezi systémy.
Obvykle to znamená, že místní systémový čas není správný. Může k tomu také dojít, pokud je hodnota exp více než 65 minut v budoucnosti od hodnoty iat nebo je hodnota exp nižší než hodnota iat.
Ujistěte se, že hodiny v systému, kde se generuje JWT, jsou správné. V případě potřeby synchronizujte svůj čas s Google NTP.
invalid_grantInvalid JWT Signature.Aktivace JWT je podepsána soukromým klíčem, který není spojen se servisním účtem identifikovaným klientským e-mailem, nebo byl klíč, který byl použit, smazán, deaktivován nebo jeho platnost vypršela.
Alternativně může být výraz JWT zakódován nesprávně – musí být zakódován v Base64, bez nových řádků nebo výplní.
Dekódujte sadu deklarací JWT a ověřte, že klíč, který podepsal aserci, je přidružen k účtu služby.
Zkuste použít knihovnu OAuth od společnosti Google, abyste se ujistili, že je JWT generováno správně.
invalid_scopeZadán neplatný rozsah OAuth nebo token ID.Nebyly požadovány žádné rozsahy (prázdný seznam rozsahů) nebo jeden z požadovaných rozsahů neexistuje (tj. je neplatný).
Ujistěte se, že deklarace rozsahu (pole) JWT je vyplněna, a porovnejte rozsahy, které obsahuje, s dokumentovanými rozsahy pro rozhraní API, která chcete použít, abyste se ujistili, že se nevyskytují žádné chyby nebo překlepy.
Upozorňujeme, že seznam oborů v deklaraci rozsahu je třeba oddělovat mezerami, nikoli čárkami.
disabled_client Klient OAuth byl deaktivován.Klíč používaný k podepsání výrazu JWT je zakázán.
Přejděte do Google API Console a pod IAM & Správce > Servisní účty, povolte servisní účet, který obsahuje "ID klíče" použitý k podpisu tvrzení.
U některých rozhraní Google API můžete provádět autorizovaná volání API pomocí podepsaného JWT přímo jako nosiče, nikoli přístupového tokenu OAuth 2.0. Pokud je to možné, můžete se vyhnout tomu, abyste před voláním rozhraní API museli odesílat síťový požadavek na autorizační server Google.
Pokud má rozhraní API, které chcete volat, definici služby zveřejněnou v úložišti GitHub rozhraní Google API, můžete místo přístupového tokenu provádět autorizovaná volání rozhraní API pomocí JWT. Udělat to tak:
Vytvořte servisní účet, jak je popsáno výše. Nezapomeňte si uschovat soubor JSON, který získáte při vytváření účtu. Pomocí jakékoli standardní knihovny JWT, jako je knihovna na adrese jwt.io, vytvořte JWT se záhlavím a užitečným obsahem jako v následujícím příkladu:{ "alg": "RS256 ", "typ": "JWT", "kid": "abcdef1234567890"}.{ "iss": "123456-compute@developer.gserviceaccount.com", "sub": "123456-compute@developer.gserviceaccount.com ", "aud": "https://firestore.googleapis.com/", "iat": 1511900000, "exp": 1511903600}Do pole dítě v záhlaví zadejte ID soukromého klíče účtu služby. Tuto hodnotu najdete v poli private_key_id souboru JSON vašeho servisního účtu. Do polí iss a podpolí zadejte e-mailovou adresu vašeho servisního účtu. Tuto hodnotu najdete v poli client_email souboru JSON vašeho servisního účtu. Pro pole aud zadejte koncový bod API. Například: https://SERVICE.googleapis.com/.Pro pole iat zadejte aktuální čas Unixu a pro poleexp zadejte čas přesně o 3600 sekund později, kdy vyprší platnost JWT.Podepište JWT s RSA-256 pomocí soukromého klíče nalezeného v souboru JSON vašeho servisního účtu.
Například:
Pověření GoogleCredential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));PrivateKey privateKey = credential.getServiceAccountPrivateKey();String privateKeyId = credential.getCurrentTime =PrivateKeyId try { Algorithm algorithm = Algorithm.RSA256(null, privateKey); String signatureJwt = JWT.create() .withKeyId(privateKeyId) .withIssuer("123456-compute@developer.gserviceaccount.com") .withSubject("123456-compute@developer.gserviceaccount.com") .withA /firestore.googleapis.com/") .withIssuedAt(new Date(nyní)) .withExpiresAt(new Date(nyní + 3600 * 1000L)) .sign(algorithm);} catch ...
Používání PyJWT:
iat = time.time()exp = iat + 3600payload = {'iss': '123456-compute@developer.gserviceaccount.com', 'sub': '123456-compute@developer.gserviceaccount.com', 'aud': 'https://firestore.googleapis.com/', 'iat': iat, 'exp': exp}additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON,headersm=alditional 'RS256') Zavolejte API pomocí podepsaného JWT jako tokenu nosiče: GET /v1/projects/abc/databases/123/indexes HTTP/1.1Oprávnění: BearerSIGNED_JWT Host: firestore.googleapis.comPREV: Jak nastavit Magento 2 s lakem a Apache na Ubuntu 16.04