Biblioteka usług Google Identity umożliwia użytkownikom wysyłanie do Google żądań autoryzacji za pomocą wyskakującego okienka przeglądarki lub przekierowania UX. Rozpoczyna to bezpieczny przepływ protokołu OAuth 2.0 i skutkuje uzyskaniem tokena dostępu do interfejsu API Google w imieniu użytkownika.
Podsumowanie procesu autoryzacji kodu autoryzacji OAuth 2.0:
- Właściciel konta Google prosi w Google o kod autoryzacji, wykonując gest taki jak kliknięcie przycisku.
- Odpowiada on na żądanie, wysyłając unikalny kod autoryzacji do wywołania zwrotnego w aplikacji internetowej JavaScript uruchomionej w przeglądarce użytkownika lub bezpośrednio wywołuje punkt końcowy kodu przekierowania za pomocą przekierowania przeglądarki.
- Platforma backendu hostuje punkt końcowy kodu autoryzacji i otrzymuje kod. Po weryfikacji kod jest wymieniany na potrzeby dostępu użytkownika i jest odświeżany przez żądanie do punktu końcowego tokena Google.
- Google weryfikuje kod autoryzacji, potwierdza żądanie pochodzące z bezpiecznej platformy, identyfikuje problemy z dostępem i tokenami odświeżania oraz zwraca tokeny, wywołując punkt końcowy logowania hostowany przez Twoją platformę.
- Punkt końcowy logowania otrzymuje token dostępu i token odświeżania, który bezpiecznie przechowuje do późniejszego użycia.
Inicjowanie klienta kodu
Metoda google.accounts.oauth2.initCodeClient()
inicjuje klienta kodu.
Wyskakujące okienko lub tryb przekierowania
Kod autoryzacji możesz udostępnić za pomocą procesu użytkownika Przekierowanie lub Wyskakujące okienko. W trybie przekierowania hostujesz punkt końcowy autoryzacji OAuth2 na serwerze, a Google przekierowuje klienta użytkownika do tego punktu końcowego, udostępniając kod uwierzytelniania jako parametr URL. W przypadku trybu wyskakującego definiuje się moduł obsługi wywołań zwrotnych JavaScript, który wysyła kod autoryzacji na serwer. Tryb tymczasowy może być przydatny dla użytkowników, którzy nie muszą opuścić witryny.
Aby zainicjować klienta dla:
Przekierowuj przepływ UX, ustaw
ux_mode
naredirect
i wartośćredirect_uri
na punkcie końcowym kodu autoryzacji platformy. Wartość musi dokładnie odpowiadać jednemu z autoryzowanych identyfikatorów URI przekierowania dla klienta OAuth 2.0 skonfigurowanego w konsoli API. Muszą też być zgodne z regułami weryfikacji identyfikatora URI przekierowania.Wyskakujące okienko UX, ustaw
ux_mode
napopup
, a wartośćcallback
na nazwę funkcji, której będziesz używać do wysyłania kodów autoryzacji do Twojej platformy.
Zapobieganie CSRF
Aby zapobiec atakom typu cross-site-Request-Forgery (CSRF), stosowany jest nieco inny technikę w procesach przekierowywania i trybu wyskakującego okienka UX. W trybie przekierowania używany jest parametr state (stan) OAuth 2.0. Więcej informacji o generowaniu i weryfikowaniu parametru state znajdziesz w sekcji RFC6749 w sekcji 10.12 Forgery z różnymi witrynami. Dzięki trybowi wyskakującemu możesz dodać do żądań niestandardowy nagłówek HTTP, a następnie sprawdzić, czy serwer pasuje do oczekiwanej wartości i źródła.
Wybierz tryb UX, aby wyświetlić fragment kodu przedstawiający kod uwierzytelniania i obsługę CSRF:
Tryb przekierowania
Zainicjuj klienta, w którym Google przekierowuje przeglądarkę użytkownika do punktu końcowego uwierzytelniania, udostępniając kod uwierzytelniania jako parametr URL.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_GOOGLE_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'redirect',
redirect_uri: "https://your.domain/code_callback_endpoint",
state: "YOUR_BINDING_VALUE"
});
Tryb wyskakujących okienek
Zainicjuj klienta, gdy przeglądarka użytkownika otrzyma od Google kod uwierzytelniania i wyśle go na Twój serwer.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_GOOGLE_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', code_receiver_uri, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Set custom header for CRSF
xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
xhr.onload = function() {
console.log('Auth code response: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
},
});
Aktywowanie przepływu kodu OAuth 2.0
Aby wywołać przepływ użytkownika, wywołaj metodę requestCode()
kodu klienta:
<button onclick="client.requestCode();">Authorize with Google</button>
W takim przypadku użytkownik będzie musiał zalogować się na konto Google i wyrazić zgodę na udostępnienie poszczególnych zakresów przed zwróceniem kodu autoryzacji do punktu końcowego przekierowania lub do modułu obsługi wywołania zwrotnego.
Obsługa kodu uwierzytelniania
Google generuje unikalny kod autoryzacji dla każdego użytkownika, który otrzymujesz i weryfikujesz na serwerze backendu.
W trybie wyskakującego moduł obsługi określony przez callback
w przeglądarce użytkownika przekazuje kod autoryzacji do punktu końcowego hostowanego przez Twoją platformę.
W trybie przekierowania żądanie GET
jest wysyłane do punktu końcowego określonego przez redirect_url
i udostępnia kod autoryzacji w parametrze kod adresu URL. Aby otrzymać kod autoryzacji:
Utwórz nowy punkt końcowy autoryzacji, jeśli nie masz jeszcze implementacji, lub
Zaktualizuj istniejący punkt końcowy, aby akceptował żądania (
GET
) i parametry adresu URL. Wcześniej żądaniePUT
z wartością kodu autoryzacji w ładunku było używane.
Punkt końcowy autoryzacji
Punkt końcowy kodu autoryzacji musi obsługiwać żądania (GET
) z tymi parametrami ciągu zapytania z URL:
Nazwa | Wartość |
---|---|
uwierzytelniający użytkownik | Prośba o uwierzytelnienie użytkownika |
koduj | Kod autoryzacji OAuth2 wygenerowany przez Google |
HD | Domena hostowana przez konto użytkownika |
znak zachęty | Okno zgody użytkownika |
zakres | Lista rozdzielonych spacjami dla co najmniej jednego zakresu OAuth2 |
state | Zmienna stanowa CRSF |
Przykładowe żądanie GET
z parametrami adresu URL do punktu końcowego o nazwie auth-code i hostowane przez example.com:
Request URL: https://www.example.com/auth-code?state=42a7bd822fe32cc56&code=4/0AX4XfWiAvnXLqxlckFUVao8j0zvZUJ06AMgr-n0vSPotHWcn9p-zHCjqwr47KHS_vDvu8w&scope=email%20profile%20https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/photoslibrary.readonly%20https://www.googleapis.com/auth/contacts.readonly%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&authuser=0&hd=example.com&prompt=consent
Gdy przepływ autoryzacji kodu jest inicjowany przez wcześniejsze biblioteki JavaScript lub przez bezpośrednie wywołania do punktów końcowych Google OAuth 2.0, używane jest żądanie POST
.
Przykładowe żądanie POST
zawierające kod autoryzacji jako ładunek w treści żądania HTTP:
Request URL: https://www.example.com/auth-code
Request Payload:
4/0AX4XfWhll-BMV82wi4YwbrSaTPaRpUGpKqJ4zBxQldU\_70cnIdh-GJOBZlyHU3MNcz4qaw
Weryfikowanie żądania
Na swoim serwerze wykonaj te czynności, by uniknąć ataków CSRF.
Sprawdź wartość parametru state (stan) w trybie przekierowania.
Potwierdź ustawienie nagłówka X-Requested-With: XmlHttpRequest
na potrzeby trybu wyskakującego.
Jeśli chcesz zweryfikować token uwierzytelniający, najpierw musisz uzyskać tokeny odświeżania i dostępu od Google.
Uzyskiwanie dostępu i tokenów odświeżania
Gdy platforma backendu otrzyma od Google kod autoryzacji i sprawdzi żądanie, użyj kodu uwierzytelniania, aby uzyskać dostęp i tokeny odświeżania od Google do wykonywania wywołań interfejsu API.
Postępuj zgodnie z instrukcjami, począwszy od Kroku 5. Kod autoryzacji Exchange na potrzeby tokenów odświeżania i dostępu w przewodniku Korzystanie z OAuth 2.0 dla aplikacji serwera WWW.
Zarządzanie tokenami
Platforma bezpiecznie przechowuje tokeny odświeżania. Usuwanie zapisanych tokenów odświeżania po usunięciu kont użytkowników lub cofnięciu zgody użytkownika przez użytkownika google.accounts.oauth2.revoke
albo bezpośrednio na stronie https://myaccount.google.com/permissions.
Możesz też włączyć szyfrowanie RISC, by chronić konta użytkowników za pomocą ochrony obejmującej wiele kont.
Zazwyczaj platforma backendu wywołuje interfejsy API Google przy użyciu tokena dostępu.
Jeśli Twoja aplikacja internetowa będzie też bezpośrednio wywoływać interfejsy API Google w przeglądarce użytkownika, musisz zaimplementować sposób udostępniania tokena dostępu aplikacji internetowej. Gdy korzystasz z tego typu biblioteki, użyj gapi.client.SetToken()
do tymczasowego przechowywania tokena dostępu w pamięci przeglądarki i włączania biblioteki do wywoływania interfejsów Google API.