Chcąc skorzystać z API udostępnianego przez Google, musimy wygenerować unikalny klucz przypisanych do naszego konta. Jest on podawany każdorazowo w trakcie wykonywania połączeń np. do Google Maps API. Do każdej z usług udostępnianych przez Google jest przypisany odpowiedni darmowy limit połączeń przez API. Co za tym idzie istotne jest zabezpieczenie naszego klucza, tak aby nikt niepowołany go sobie nie „pożyczył” i wykorzystał naszego limitu.

Odwołując się do Google Maps JavaScript API musimy umieścić w adresie nasz klucz:

<script src="https://maps.googleapis.com/maps/api/js?key=KLUCZ_API&callback=initMap" async defer></script>

Jak widać klucz jest tutaj umieszczony w sposób jawny. Nic więc nie stoi na przeszkodzie, aby ktoś umieścił go w ramach swojej strony/aplikacji www. Pomijam na razie inne zabezpieczenia, o których wspomnę na końcu.

Prostym rozwiązaniem tego problemu, może być wykorzystanie PHP i np. funkcji file_get_contents(). Poniższą funkcję umieszczamy w ramach swojej aplikacji:

/**
 * Pobranie Google Maps Api
 */
public function getGoogleApiAction()
{
        $url = 'https://maps.googleapis.com/maps/api/js?key=KLUCZ_API&callback=initMap';
        $content = file_get_contents($url);
        
        return $content;
        
}//end getGoogleApiAction()

Pozostaje nam zamienić w kodzie strony adres w odwołaniu do JS.

<script src="/getGoogleApi" async defer></script>

Funkcja może być dodatkowo zabezpieczona np. do połączeń w ramach aplikacji. Tutaj już deweloper może wykazać się inwencją. Powyższy przykład jest oczywiście bardzo prosty, niemniej jednak może być takim pierwszym zabezpieczeniem przed np. skanowaniem kodu stron celem podkradana kluczy API. Takie, czy bardziej rozbudowane ukrywanie kluczy zależy bezpośrednio od dewelopera.

Zabezpieczenia przez Google Developer Console

Google ze swojej strony udostępniło listę dobry praktyk pozwalających na zabezpieczenie kluczy API. Znaleźć można je pod adresem: Best practices for securely using API keys

W pierwszym punkcie zostało zalecone to o czym pisałem powyżej:

Nie umieszczaj kluczy API bezpośrednio w kodzie: klucze API osadzone w kodzie mogą być przypadkowo stać się publiczne, na przykład, jeśli zapomnisz usunąć klucze z udostępnianego kodu. Zamiast osadzać klucze API w aplikacjach, przechowuj je w zmiennych środowiskowych lub w plikach poza drzewem źródłowymi aplikacji.

Punkt drugi związany jest z pierwszym i zaleca przechowywanie kluczy poza drzewem aplikacji, dzięki czemu można np. uniknąć ryzyka przesłania ich repozytorium w ramach GitHub czy Bitbucket.

Punkt trzeci zaleca zdefiniowanie w konsoli Google autoryzowanych adresów IP, domen i aplikacji. Zabezpieczenie klucza w ten sposób, nie pozwoli na odwołanie się do niego z innego miejsca niż ściśle określone. Dla każdego klucza można zdefiniować te restrykcje osobno.

Kolejne punkty zalecają usuwanie nieużywanych kluczy, okresowe generowanie nowych kluczy API oraz przeglądanie kodu przed jego upublicznieniem, aby uniknąć sytuacji, gdy upubliczniamy również klucz API.

Korzystając z zalecanych praktyk i dodatkowo starając się w ramach aplikacji samodzielnie zabezpieczyć nasz klucz, zmniejszymy ryzyko jego wycieku na zewnątrz. Wówczas przydzielony nam darmowy limit, będzie faktycznie dostępny tylko dla nas i nie spotka nas sytuacja, w której na skutek zaniedbań jakaś funkcjonalność naszej strony stała się niedostępna.