Omówienie
Aby uzyskać token dostępu na użytkownika w celu wywołania interfejsów API Google, Google oferuje Biblioteki JavaScript:
- Biblioteka platformy logowania Google
- Biblioteka klienta interfejsów API Google do języka JavaScript
Ten przewodnik zawiera instrukcje migracji z tych bibliotek do Google Analytics biblioteki usług tożsamości.
Postępując zgodnie z tym przewodnikiem:
- zastąp wycofaną bibliotekę usług biblioteką usług tożsamości, oraz
- jeśli korzystasz z biblioteki klienta API, usuń wycofany moduł
gapi.auth2
, jego metod i obiektów, zastępując je odpowiednikami usług tożsamości.
Opis tego, co się zmieniło w kodzie JavaScript usług tożsamości przeczytaj omówienie i dowiedz się, jak działa autoryzacja użytkowników. kluczowych terminach i koncepcjach.
Jeśli interesuje Cię uwierzytelnianie rejestracji użytkowników i logowania, przeczytaj artykuł Migracja z Logowanie przez Google
Identyfikowanie procesu autoryzacji
Dostępne są 2 procesy autoryzacji użytkownika: niejawne i autoryzacja w kodzie.
Sprawdź swoją aplikację internetową, aby określić obecny typ przepływu autoryzacji. w korzystaniu z niej.
Wskazania aplikacji internetowej korzystające z przepływu niejawnego:
- Twoja aplikacja internetowa działa wyłącznie w przeglądarce i nie ma platformy backendu.
- Aby wywoływać interfejsy API Google, użytkownik musi być obecny. Aplikacja korzysta tylko z dostępu i nie wymaga tokenów odświeżania.
- Twoja aplikacja internetowa wczytuje się
apis.google.com/js/api.js
. - Twoja implementacja opiera się na protokole OAuth 2.0 na potrzeby witryn internetowych po stronie klienta Aplikacje.
- Aplikacja używa modułów
gapi.client
lubgapi.auth2
znalezionych w Biblioteka klienta interfejsów API Google do języka JavaScript
Wskazania aplikacji internetowej korzystające z przepływu kodu autoryzacji:
Implementacja zależy od tych czynników:
Aplikacja działa zarówno w przeglądarce użytkownika, jak i na platformie backendu.
Platforma backendu hostuje punkt końcowy kodu autoryzacji.
Platforma backendu wywołuje interfejsy API Google w imieniu użytkowników bez konieczności ich dostępność, czyli w trybie offline.
Tokeny odświeżania są zarządzane i przechowywane przez platformę backendu.
W niektórych przypadkach baza kodu może obsługiwać oba przepływy.
Wybierz proces autoryzacji
Przed rozpoczęciem migracji musisz sprawdzić, czy lub zastosowanie innego procesu najlepiej odpowiada Twoim potrzebom.
Przeczytaj artykuł o wybieraniu procesu autoryzacji, aby poznać najważniejsze różnice. i kompromisów między tymi 2 procesami.
W większości przypadków zalecany jest przepływ kodu autoryzacji, ponieważ zapewnia z najwyższym poziomem bezpieczeństwa. Wdrożenie tej procedury pozwala też platformy do łatwego dodawania nowych funkcji offline, takich jak pobieranie aktualizacji. aby powiadamiać użytkowników o ważnych zmianach w ich kalendarzu, zdjęciach, subskrypcjach i tak dalej.
Wybierz proces autoryzacji, korzystając z selektorów poniżej.
Przepływ niejawny
Uzyskiwanie tokena dostępu do użytku w przeglądarce, gdy użytkownik jest obecny.
Przykłady przepływu pośredniego obejmują aplikacje internetowe przed migracją do usługi i po niej Usługi tożsamości.
Przepływ kodu autoryzacji
Wydany przez Google kod autoryzacji na użytkownika jest dostarczany do Twojego backendu platformy, w której jest wymieniana jako token dostępu i token odświeżania.
Przykłady przepływu kodu autoryzacji pokazują aplikacje internetowe przed i po migracji do usług tożsamości.
W tym przewodniku postępuj zgodnie z pogrubionymi instrukcjami dotyczącymi dodawania, Usuń, Zaktualizuj lub Zastąp istniejącą funkcję.
Zmiany w aplikacji internetowej w przeglądarce
W tej sekcji znajdziesz informacje o zmianach, które wprowadzisz w aplikacji internetowej w przeglądarce, gdy do biblioteki JavaScript Google Identity Services.
Identyfikacja kodu, którego dotyczy problem, i testowanie
Plik cookie debugowania ułatwia znalezienie kodu, którego dotyczy problem, i przetestowanie po jego wycofaniu zachowanie użytkownika.
W dużych lub złożonych aplikacjach może być trudno znaleźć cały kod, którego dotyczy
wycofanie modułu gapi.auth2
. Aby zapisać bieżące użycie usługi, która wkrótce będzie
wycofanej funkcji w konsoli, ustaw wartość atrybutu
G_AUTH2_MIGRATION
plik cookie do informational
. Opcjonalnie dodaj dwukropek, a następnie
według pary klucz-wartość, by rejestrować też miejsce na dane sesji. Po zalogowaniu
i otrzymanie danych logowania do weryfikacji lub wysyłanie zebranych dzienników do zaplecza w celu późniejszego użycia.
analizy. Na przykład informational:showauth2use
zapisuje pochodzenie i adres URL w kodzie
klucz pamięci sesji o nazwie showauth2use
.
Aby weryfikować działanie aplikacji po tym, jak moduł gapi.auth2
nie jest już wczytywany, ustaw parametr
z pliku cookie G_AUTH2_MIGRATION
do enforced
. Umożliwia to testowanie
działania po wycofaniu usługi przed datą wejścia w życie zasad.
Możliwe wartości pliku cookie G_AUTH2_MIGRATION
:
enforced
Nie ładuj moduługapi.auth2
.informational
Loguje użycie wycofanych funkcji w konsoli JS. Także zapisz w pamięci sesji, gdy ustawiono opcjonalną nazwę klucza:informational:key-name
Aby zminimalizować wpływ na użytkowników, zalecamy najpierw ustawienie tego pliku cookie lokalnie w fazie programowania i testów, a przed użyciem w środowiskach produkcyjnych.
Biblioteki i moduły
Moduł gapi.auth2
zarządza uwierzytelnianiem użytkowników podczas logowania i blokadą domową
procesu autoryzacji, zastąp ten wycofany moduł oraz jego obiekty i
z biblioteką usług tożsamości Google.
Dodaj bibliotekę usług tożsamości do aplikacji internetowej, dodając ją w dokument:
<script src="https://accounts.google.com/gsi/client" async defer></script>
Usuń wszystkie wystąpienia wczytywania modułu auth2
za pomocą polecenia gapi.load('auth2',
function)
.
Biblioteka usług tożsamości Google zastępuje korzystanie z modułu gapi.auth2
.
Możesz dalej bezpiecznie korzystać z modułu gapi.client
z interfejsu API Google
z biblioteki klienta dla języka JavaScript i korzystać z jego automatycznego tworzenia;
wywoływanych metod JS z dokumentu odkrywania, grupowania wielu wywołań interfejsu API
i funkcjami zarządzania CORS.
Pliki cookie
Autoryzacja użytkownika nie wymaga użycia plików cookie.
Szczegółowe informacje na temat uwierzytelniania użytkowników znajdziesz w artykule Migracja z logowania przez Google. korzysta z plików cookie oraz jak Google używa tych plików w celu ich wykorzystywania przez inne osoby, Produkty i usługi Google.
Dane logowania
Usługi tożsamości Google rozdzielają uwierzytelnianie i autoryzację użytkowników w są to odrębne operacje, a dane logowania użytkownika są oddzielne: token tożsamości służący do identyfikują użytkownika, który jest zwracany niezależnie od tokena dostępu używanego do autoryzacji.
Aby zobaczyć te zmiany, zobacz przykładowe dane logowania.
Przepływ niejawny
Oddziel uwierzytelnianie i autoryzację użytkowników przez usunięcie profilu użytkownika z procesów autoryzacji.
Usuń te odwołania do klienta JavaScript logowania przez Google:
Metody
GoogleUser.getBasicProfile()
GoogleUser.getId()
Przepływ kodu autoryzacji
Usługi tożsamości rozdzielają dane logowania w przeglądarce na token tożsamości i dostęp token. Ta zmiana nie dotyczy danych logowania uzyskanych bezpośrednio punktów końcowych Google OAuth 2.0 z platformy backendu lub przez biblioteki działające na bezpiecznym serwerze na Twojej platformie, takie jak Google API Node.js.
Stan sesji
Wcześniej funkcja Logowania przez Google umożliwiała zarządzanie stanem zalogowania użytkownika za pomocą:
- Moduły obsługi wywołań zwrotnych do monitorowania stanu sesji użytkownika.
- Detektory zdarzeń i zmiany stanu zalogowania na koncie użytkownika Konto Google.
Odpowiadasz za zarządzanie stanem logowania i sesjami użytkowników w przeglądarce. .
Usuń te odwołania do klienta JavaScript logowania przez Google:
Obiekty:
gapi.auth2.SignInOptions
Metody:
GoogleAuth.attachClickHandler()
GoogleAuth.isSignedIn()
GoogleAuth.isSignedIn.get()
GoogleAuth.isSignedIn.listen()
GoogleAuth.signIn()
GoogleAuth.signOut()
GoogleAuth.currentUser.get()
GoogleAuth.currentUser.listen()
GoogleUser.isSignedIn()
Konfiguracja klienta
Zaktualizuj aplikację internetową, aby zainicjować klienta tokena dla niejawnego lub przez kod autoryzacji.
Usuń te odwołania do klienta JavaScript logowania przez Google:
Obiekty:
gapi.auth2.ClientConfig
gapi.auth2.OfflineAccessOptions
Metody:
gapi.auth2.getAuthInstance()
GoogleUser.grant()
Przepływ niejawny
Dodaj obiekt TokenClientConfig
i wywołanie initTokenClient()
do
skonfiguruj swoją aplikację internetową, postępując zgodnie z przykładem inicjowania tokena.
.
Zastąp odwołania do klienta JavaScript logowania przez Google tekstem Google Usługi tożsamości:
Obiekty:
gapi.auth2.AuthorizeConfig
iTokenClientConfig
Metody:
gapi.auth2.init()
igoogle.accounts.oauth2.initTokenClient()
Parametry:
gapi.auth2.AuthorizeConfig.login_hint
zTokenClientConfig.login_hint
gapi.auth2.GoogleUser.getHostedDomain()
z:TokenClientConfig.hd
.
Przepływ kodu autoryzacji
Dodaj obiekt CodeClientConfig
i wywołanie initCodeClient()
, aby je skonfigurować.
w aplikacji internetowej, postępując zgodnie z przykładem inicjowania klienta kodu.
Gdy przechodzisz z przepływu niejawnego na przepływ kodu autoryzacji:
Usuń odwołania do klienta JavaScript logowania przez Google
Obiekty:
gapi.auth2.AuthorizeConfig
Metody:
gapi.auth2.init()
Parametry:
gapi.auth2.AuthorizeConfig.login_hint
gapi.auth2.GoogleUser.getHostedDomain()
Żądanie tokena
Gest użytkownika, na przykład kliknięcie przycisku, generuje żądanie, które powoduje token dostępu zwracany bezpośrednio do przeglądarki użytkownika z domyślnym, lub na platformę backendu po wymianie kodu autoryzacji dla poszczególnych użytkowników. dla tokena dostępu i tokenu odświeżania.
Przepływ niejawny
Tokeny dostępu można uzyskiwać i używać w przeglądarce, gdy użytkownik zalogowany i ma aktywną sesję z Google. W trybie niejawnym użytkownik aby zażądać tokena dostępu, wymagany jest gest, nawet jeśli użytkownika.
Zastąp odwołania do klienta JavaScript logowania przez Google: Google Usługi tożsamości:
Metody:
gapi.auth2.authorize()
iTokenClient.requestAccessToken()
GoogleUser.reloadAuthResponse()
zTokenClient.requestAccessToken()
Dodaj link lub przycisk, aby wywołać metodę requestAccessToken()
i zainicjować
wyskakujące okienko UX, aby poprosić o token dostępu lub uzyskać nowy, gdy
istniejący token wygaśnie.
Zaktualizuj bazę kodu:
- Aktywuj przepływ tokenów OAuth 2.0 za pomocą
requestAccessToken()
. - Wspomagaj przyrostową autoryzację za pomocą metod
requestAccessToken
iOverridableTokenClientConfig
do rozdzielenia jednego żądania dla wielu zakresów na kilka mniejszych. - Poproś o nowy token, gdy istniejący token wygaśnie lub zostanie unieważniony.
Praca z wieloma zakresami może wymagać zmian strukturalnych w bazie kodu o dostęp do zakresów tylko w miarę potrzeb, a nie o dostęp do wszystkich naraz, jest to tzw. autoryzacja przyrostowa. Każde żądanie powinno zawierać: najlepiej jest wybrać tylko 1 zakres. Zobacz, jak obsługiwać użytkownika więcej informacji o tym, jak zaktualizować aplikację pod kątem przyrostu wartości autoryzacji.
Gdy token dostępu wygaśnie, moduł gapi.auth2
automatycznie uzyska
nowy, prawidłowy token dostępu do Twojej aplikacji internetowej. Aby zwiększyć bezpieczeństwo użytkowników,
Proces automatycznego odświeżania tokenów nie jest obsługiwany przez Tożsamość Google
Biblioteka usług. Musisz zaktualizować aplikację internetową, aby móc wykrywać wygasły dostęp
i poproś o nowy. Więcej informacji znajdziesz w sekcji Obsługa tokenów poniżej.
Przepływ kodu autoryzacji
Dodaj link lub przycisk, aby wywołać metodę requestCode()
i poprosić o autoryzację
kod od Google. Przykład znajdziesz w artykule Aktywowanie przepływu kodu OAuth 2.0.
W sekcji Obsługa tokenów poniżej znajdziesz więcej informacji o tym, jak odpowiadać token dostępu stracił ważność lub został unieważniony.
Obsługa tokenów
Dodaj obsługę błędów, aby wykrywać nieudane wywołania Google API po wygaśnięciu lub i zażądać nowego, prawidłowego tokenu dostępu.
Komunikat o błędzie HTTP 401 Unauthorized
i invalid_token
to
zwracanych przez interfejsy API Google w przypadku użycia wygasłego lub unieważnionego tokena dostępu. Dla
Przykład: przeczytaj artykuł Nieprawidłowa odpowiedź tokena.
Wygasłe tokeny
Tokeny dostępu mają krótki czas ważności i często są ważne tylko przez kilka minut.
Unieważnienie tokena
Właściciel konta Google może w każdej chwili cofnąć udzieloną wcześniej zgodę. Wykonuję
unieważnia więc istniejące tokeny dostępu i tokeny odświeżania. Odwołanie może być
uruchomione z Twojej platformy za pomocą revoke()
lub Google
Konto.
Zastąp odwołania do klienta JavaScript logowania przez Google: Google Usługi tożsamości:
Metody:
getAuthInstance().disconnect()
igoogle.accounts.oauth2.revoke()
GoogleUser.disconnect()
igoogle.accounts.oauth2.revoke()
Wywołaj revoke
, gdy użytkownik usunie swoje konto na Twojej platformie.
chce usunąć zgodę na udostępnianie danych Twojej aplikacji.
Prośba o zgodę użytkownika
Google wyświetla użytkownikowi okno z prośbą o zgodę na przetwarzanie danych osobowych, gdy korzystasz z aplikacji internetowej lub backendu żąda od platformy tokena dostępu. Zobacz przykładowe okna z prośbą o zgodę na przetwarzanie danych przez Google.
Przed wystawieniem tokena dostępu do aplikacji istniejący i aktywny jest wymagana do wyświetlenia użytkownikowi prośby o zgodę i zapisania wyniku. Użytkownik może być wymagane zalogowanie się na konto Google, jeśli istniejąca sesja nie już ustanowiono.
Logowanie użytkownika
Użytkownicy mogą być zalogowani na konto Google na osobnej karcie przeglądarki lub bezpośrednio w przeglądarce lub systemie operacyjnym. Zalecamy dodanie opcji Zaloguj się przez Google do Twojej witryny, aby nawiązać aktywną sesję między kontem Google. i przeglądarkę, gdy użytkownik uruchomi aplikację po raz pierwszy. Dzięki temu Korzyści:
- minimalizuje liczbę razy, gdy użytkownik musi się zalogować, aby uzyskać dostęp rozpoczyna proces logowania na konto Google, jeśli aktywna sesja które jeszcze nie istnieją.
- Bezpośrednie użycie pola danych logowania
email
tokena JWT jako wartości parametrlogin_hint
w elemencieCodeClientConfig
lubTokenClientConfig
obiektów. Jest to szczególnie przydatne, jeśli Twoja platforma nie obsługuje system zarządzania kontami użytkowników. - Wyszukaj konto Google i powiąż je z istniejącym lokalnym kontem użytkownika w swoją platformę, co pomaga w ograniczeniu liczby zduplikowanych kont.
- Po utworzeniu nowego konta lokalnego okno rejestracji i proces rejestracji mogą wyraźnie oddzielone od okien i procesów uwierzytelniania użytkowników, co zmniejsza liczby wymaganych kroków i poprawę współczynnika porzuceń.
Po zalogowaniu się, ale przed wydaniem tokena dostępu, użytkownicy muszą wyrazić zgodę dla Twojej aplikacji dla żądanych zakresów.
Token i odpowiedź z prośbą o zgodę
Po uzyskaniu zgody użytkownika zwracany jest token dostępu wraz z listą zatwierdzonych zakresów. lub odrzucone przez użytkownika.
Szczegółowe uprawnienia pozwalają użytkownikom zatwierdzać i odrzucać poszczególne zakresy. Kiedy wysyłając prośbę o dostęp do wielu zakresów, każdy z nich zostanie przyznany lub odrzucony niezależnie od innych zakresów. Na podstawie wybiórczego wyboru aplikacji przez użytkownika umożliwia korzystanie z funkcji, które zależą od indywidualnego zakresu.
Przepływ niejawny
Zastąp odwołania do klienta JavaScript logowania przez Google tekstem Google Usługi tożsamości:
Obiekty:
gapi.auth2.AuthorizeResponse
iTokenClient.TokenResponse
gapi.auth2.AuthResponse
iTokenClient.TokenResponse
Metody:
GoogleUser.hasGrantedScopes()
zgoogle.accounts.oauth2.hasGrantedAllScopes()
GoogleUser.getGrantedScopes()
zgoogle.accounts.oauth2.hasGrantedAllScopes()
Usuń odwołania do klienta JavaScript logowania przez Google:
Metody:
GoogleUser.getAuthResponse()
Zaktualizuj aplikację internetową, używając tagów hasGrantedAllScopes()
i
hasGrantedAnyScope()
, postępując zgodnie z tym przykładem szczegółowych uprawnień.
Przepływ kodu autoryzacji
Zaktualizuj lub dodaj do backendu punkt końcowy kodu autoryzacji , postępując zgodnie z instrukcjami podanymi w sekcji dotyczącej obsługi kodu autoryzacji.
Zaktualizuj platformę zgodnie z instrukcjami opisanymi w artykule na temat korzystania z kodu. Przewodnik po modelu pokazujący weryfikację żądania, uzyskiwanie tokena dostępu i odświeżanie token.
Zaktualizuj platformę, aby wybiórczo włączać lub wyłączać funkcje. funkcji na podstawie poszczególnych zakresów zatwierdzonych przez użytkownika postępując zgodnie z instrukcjami dodatkowej autoryzacji i sprawdzać, i przyznanych przez użytkownika zakresów dostępu.
Przykłady przepływu niejawnego
Stary sposób
Biblioteka klienta GAPI
Przykład biblioteki klienta interfejsów API Google do obsługi JavaScriptu uruchomione w przeglądarce i wyświetlające wyskakujące okienko z prośbą o zgodę na przetwarzanie danych osobowych.
Moduł gapi.auth2
jest automatycznie ładowany i używany przez
gapi.client.init()
i dlatego są ukryte.
<!DOCTYPE html>
<html>
<head>
<script src="https://apis.google.com/js/api.js"></script>
<script>
function start() {
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'scope': 'https://www.googleapis.com/auth/cloud-translation',
'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
}).then(function() {
// Execute an API request which is returned as a Promise.
// The method name language.translations.list comes from the API discovery.
return gapi.client.language.translations.list({
q: 'hello world',
source: 'en',
target: 'de',
});
}).then(function(response) {
console.log(response.result.data.translations[0].translatedText);
}, function(reason) {
console.log('Error: ' + reason.result.error.message);
});
};
// Load the JavaScript client library and invoke start afterwards.
gapi.load('client', start);
</script>
</head>
<body>
<div id="results"></div>
</body>
</html>
Biblioteka klienta JS
Protokół OAuth 2.0 dla aplikacji internetowych po stronie klienta uruchomiony w przeglądarce przy użyciu wyskakujące okienko z prośbą o zgodę użytkownika.
Moduł gapi.auth2
jest wczytywany ręcznie.
<!DOCTYPE html>
<html><head></head><body>
<script>
var GoogleAuth;
var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
function handleClientLoad() {
// Load the API's client and auth2 modules.
// Call the initClient function after the modules load.
gapi.load('client:auth2', initClient);
}
function initClient() {
// In practice, your app can retrieve one or more discovery documents.
var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';
// Initialize the gapi.client object, which app uses to make API requests.
// Get API key and client ID from API Console.
// 'scope' field specifies space-delimited list of access scopes.
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'discoveryDocs': [discoveryUrl],
'scope': SCOPE
}).then(function () {
GoogleAuth = gapi.auth2.getAuthInstance();
// Listen for sign-in state changes.
GoogleAuth.isSignedIn.listen(updateSigninStatus);
// Handle initial sign-in state. (Determine if user is already signed in.)
var user = GoogleAuth.currentUser.get();
setSigninStatus();
// Call handleAuthClick function when user clicks on
// "Sign In/Authorize" button.
$('#sign-in-or-out-button').click(function() {
handleAuthClick();
});
$('#revoke-access-button').click(function() {
revokeAccess();
});
});
}
function handleAuthClick() {
if (GoogleAuth.isSignedIn.get()) {
// User is authorized and has clicked "Sign out" button.
GoogleAuth.signOut();
} else {
// User is not signed in. Start Google auth flow.
GoogleAuth.signIn();
}
}
function revokeAccess() {
GoogleAuth.disconnect();
}
function setSigninStatus() {
var user = GoogleAuth.currentUser.get();
var isAuthorized = user.hasGrantedScopes(SCOPE);
if (isAuthorized) {
$('#sign-in-or-out-button').html('Sign out');
$('#revoke-access-button').css('display', 'inline-block');
$('#auth-status').html('You are currently signed in and have granted ' +
'access to this app.');
} else {
$('#sign-in-or-out-button').html('Sign In/Authorize');
$('#revoke-access-button').css('display', 'none');
$('#auth-status').html('You have not authorized this app or you are ' +
'signed out.');
}
}
function updateSigninStatus() {
setSigninStatus();
}
</script>
<button id="sign-in-or-out-button"
style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
style="display: none; margin-left: 25px">Revoke access</button>
<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
onload="this.onload=function(){};handleClientLoad()"
onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>
OAuth 2.0 Endpoints
Protokół OAuth 2.0 dla aplikacji internetowych po stronie klienta działających w przeglądarce przy użyciu przekierowuje użytkownika do Google.
Ten przykład pokazuje bezpośrednie wywołania punktów końcowych OAuth 2.0 Google z
z przeglądarki użytkownika i nie używa modułu gapi.auth2
ani JavaScriptu.
bibliotece.
<!DOCTYPE html>
<html><head></head><body>
<script>
var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
var fragmentString = location.hash.substring(1);
// Parse query string to see if page request is coming from OAuth 2.0 server.
var params = {};
var regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(fragmentString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
if (Object.keys(params).length > 0) {
localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
if (params['state'] && params['state'] == 'try_sample_request') {
trySampleRequest();
}
}
// If there's an access token, try an API request.
// Otherwise, start OAuth 2.0 flow.
function trySampleRequest() {
var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
if (params && params['access_token']) {
var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/about?fields=user&' +
'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.response);
} else if (xhr.readyState === 4 && xhr.status === 401) {
// Token invalid, so prompt for user permission.
oauth2SignIn();
}
};
xhr.send(null);
} else {
oauth2SignIn();
}
}
/*
* Create form to request access token from Google's OAuth 2.0 server.
*/
function oauth2SignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create element to open OAuth 2.0 endpoint in new window.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client_id': YOUR_CLIENT_ID,
'redirect_uri': YOUR_REDIRECT_URI,
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'state': 'try_sample_request',
'include_granted_scopes': 'true',
'response_type': 'token'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
</script>
<button onclick="trySampleRequest();">Try sample request</button>
</body></html>
Nowy sposób
Tylko GIS
W tym przykładzie pokazujemy tylko bibliotekę JavaScriptu usługi Google Identity Service przy użyciu modelu tokena i wyskakujące okienko z prośbą o zgodę na przetwarzanie danych osobowych. Jest pozwala zilustrować minimalną liczbę kroków wymaganych do skonfigurowania klienta, żądania i uzyskania tokena dostępu oraz wywołania interfejsu API Google.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
var access_token;
function initClient() {
client = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/contacts.readonly',
callback: (tokenResponse) => {
access_token = tokenResponse.access_token;
},
});
}
function getToken() {
client.requestAccessToken();
}
function revokeToken() {
google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
}
function loadCalendar() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
xhr.send();
}
</script>
<h1>Google Identity Services Authorization Token model</h1>
<button onclick="getToken();">Get access token</button><br><br>
<button onclick="loadCalendar();">Load Calendar</button><br><br>
<button onclick="revokeToken();">Revoke token</button>
</body>
</html>
GAPI asynchroniczny/oczekiwanie
Ten przykład pokazuje, jak dodać bibliotekę usługi tożsamości Google przy użyciu
token, usuń moduł gapi.auth2
i wywołaj interfejs API za pomocą metody
Biblioteka klienta interfejsów API Google do języka JavaScript.
Obietnice, asynchronizacja i oczekiwanie są używane do egzekwowania kolejności wczytywania biblioteki oraz przechwytywania i ponawiania błędów autoryzacji. Wywołanie interfejsu API jest wykonywane dopiero po prawidłowej token dostępu.
Użytkownicy powinni nacisnąć przycisk „Pokaż kalendarz” gdy token dostępu brakuje przy pierwszym wczytaniu strony lub później po tokenie dostępu wygasła.
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>GAPI with GIS async/await</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
const gapiLoadPromise = new Promise((resolve, reject) => {
gapiLoadOkay = resolve;
gapiLoadFail = reject;
});
const gisLoadPromise = new Promise((resolve, reject) => {
gisLoadOkay = resolve;
gisLoadFail = reject;
});
var tokenClient;
(async () => {
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
// First, load and initialize the gapi.client
await gapiLoadPromise;
await new Promise((resolve, reject) => {
// NOTE: the 'auth2' module is no longer loaded.
gapi.load('client', {callback: resolve, onerror: reject});
});
await gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
});
// Now load the GIS client
await gisLoadPromise;
await new Promise((resolve, reject) => {
try {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
prompt: 'consent',
callback: '', // defined at request time in await/promise scope.
});
resolve();
} catch (err) {
reject(err);
}
});
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
})();
async function getToken(err) {
if (err.result.error.code == 401 || (err.result.error.code == 403) &&
(err.result.error.status == "PERMISSION_DENIED")) {
// The access token is missing, invalid, or expired, prompt for user consent to obtain one.
await new Promise((resolve, reject) => {
try {
// Settle this promise in the response callback for requestAccessToken()
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
reject(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
resolve(resp);
};
tokenClient.requestAccessToken();
} catch (err) {
console.log(err)
}
});
} else {
// Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
throw new Error(err);
}
}
function showEvents() {
// Try to fetch a list of Calendar events. If a valid access token is needed,
// prompt to obtain one and then retry the original request.
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => getToken(err)) // for authorization errors obtain an access token
.then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err)); // cancelled by user, timeout, etc.
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
}
}
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>
</body>
</html>
Wywołanie zwrotne GAPI
Ten przykład pokazuje, jak dodać bibliotekę usługi tożsamości Google przy użyciu
token, usuń moduł gapi.auth2
i wywołaj interfejs API za pomocą metody
Biblioteka klienta interfejsów API Google do języka JavaScript.
Zmienne służą do egzekwowania kolejności wczytywania biblioteki. Wywołania GAPI z poziomu wywołania zwrotnego po zwróceniu prawidłowego tokena dostępu.
Użytkownicy powinni nacisnąć przycisk Pokaż kalendarz na pierwszej stronie zostanie wczytany i ponownie, gdy będzie chciał odświeżyć informacje w Kalendarzu.
<!DOCTYPE html>
<html>
<head>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
<h1>GAPI with GIS callbacks</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
let tokenClient;
let gapiInited;
let gisInited;
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
function checkBeforeStart() {
if (gapiInited && gisInited){
// Start only when both gapi and gis are initialized.
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
}
}
function gapiInit() {
gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
gapiInited = true;
checkBeforeStart();
});
}
function gapiLoad() {
gapi.load('client', gapiInit)
}
function gisInit() {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
callback: '', // defined at request time
});
gisInited = true;
checkBeforeStart();
}
function showEvents() {
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
throw(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err));
document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
}
// Conditionally ask users to select the Google Account they'd like to use,
// and explicitly obtain their consent to fetch their Calendar.
// NOTE: To request an access token a user gesture is necessary.
if (gapi.client.getToken() === null) {
// Prompt the user to select a Google Account and asked for consent to share their data
// when establishing a new session.
tokenClient.requestAccessToken({prompt: 'consent'});
} else {
// Skip display of account chooser and consent dialog for an existing session.
tokenClient.requestAccessToken({prompt: ''});
}
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
document.getElementById("showEventsBtn").innerText = "Show Calendar";
}
}
</script>
</body>
</html>
Przykłady przepływu kodu autoryzacji
Wyskakujące okienko biblioteki usługi tożsamości Google może użyć przekierowania URL do zwraca kod autoryzacji bezpośrednio do punktu końcowego tokena backendu lub Moduł obsługi wywołań zwrotnych JavaScript działający w przeglądarce użytkownika, który pośredniczy w serwerze na Twoją platformę. W obu przypadkach platforma backendu wykona działanie przez OAuth 2.0, aby uzyskać prawidłowy token odświeżania i token dostępu.
Stary sposób
Aplikacje internetowe po stronie serwera
Logowanie przez Google w aplikacjach po stronie serwera działających na platformie backendu za pomocą przekierowania do Google, aby uzyskać zgodę użytkownika.
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'YOUR_CLIENT_ID',
api_key: 'YOUR_API_KEY',
discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
// Scopes to request in addition to 'profile' and 'email'
scope: 'https://www.googleapis.com/auth/cloud-translation',
});
});
}
function signInCallback(authResult) {
if (authResult['code']) {
console.log("sending AJAX request");
// Send authorization code obtained from Google to backend platform
$.ajax({
type: 'POST',
url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
// Always include an X-Requested-With header to protect against CSRF attacks.
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
contentType: 'application/octet-stream; charset=utf-8',
success: function(result) {
console.log(result);
},
processData: false,
data: authResult['code']
});
} else {
console.log('error: failed to obtain authorization code')
}
}
</script>
</head>
<body>
<button id="signinButton">Sign In With Google</button>
<script>
$('#signinButton').click(function() {
// Obtain an authorization code from Google
auth2.grantOfflineAccess().then(signInCallback);
});
</script>
</body>
</html>
HTTP/REST przy użyciu przekierowania
Używanie OAuth 2.0 w aplikacjach serwera WWW do wysyłania kodu autoryzacji z przeglądarki użytkownika do platformy backendu. Zgoda użytkownika jest obsługiwana przez przekierowując przeglądarkę użytkownika do Google.
/\*
\* Create form to request access token from Google's OAuth 2.0 server.
\*/
function oauthSignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create <form> element to submit parameters to OAuth 2.0 endpoint.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client\_id': 'YOUR_CLIENT_ID',
'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
'response\_type': 'token',
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'include\_granted\_scopes': 'true',
'state': 'pass-through value'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
Nowy sposób
Wyskakujące okienko GIS – UX
W tym przykładzie pokazujemy tylko bibliotekę JavaScriptu usługi Google Identity Service za pomocą modelu kodu autoryzacji, pojawi się wyskakujące okienko z prośbą o zgodę na przetwarzanie danych osobowych. modułu obsługi wywołania zwrotnego, aby otrzymać kod autoryzacji od Google. Jest pozwala zilustrować minimalną liczbę kroków wymaganych do skonfigurowania , uzyskanie zgody i wysłanie kodu autoryzacji do backendu platformy.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
// Send auth code to your backend platform
const xhr = new XMLHttpRequest();
xhr.open('POST', code_receiver_uri, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
// After receipt, the code is exchanged for an access token and
// refresh token, and the platform then updates this web app
// running in user's browser with the requested calendar info.
},
});
}
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
UX przekierowania GIS
Model kodu autoryzacji obsługuje wyskakujące okienka i przekierowuje tryby UX do wysyłanie kodu autoryzacji na użytkownika do punktu końcowego hostowanego przez Twoją platformę. Tryb UX przekierowania jest widoczny tutaj:
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/photoslibrary.readonly',
ux_mode: 'redirect',
redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
});
}
// Request an access token
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
Biblioteki JavaScript
Usługi tożsamości Google to pojedyncza biblioteka JavaScript używana na potrzeby użytkowników uwierzytelniania i autoryzacji, które łączy i zastępuje funkcje dostępne w wielu różnych bibliotekach i modułach:
- Klient JavaScript logowania Google oraz
- Biblioteka klienta interfejsów API Google do języka JavaScript
Działania, które należy wykonać podczas migracji do usług tożsamości:
Istniejąca biblioteka JS | Nowa biblioteka JS | Uwagi |
---|---|---|
apis.google.com/js/api.js |
accounts.google.com/gsi/client |
Dodaj nową bibliotekę i postępuj zgodnie z instrukcjami. |
apis.google.com/js/client.js |
accounts.google.com/gsi/client |
Dodaj nową bibliotekę i przepływ kodu autoryzacji. |
Krótki przewodnik po bibliotece
Porównanie obiektów i metod starego kodu JavaScript do logowania przez Google klienta oraz biblioteki nowych usług tożsamości Google oraz Uwagi z dodatkowymi informacjami i czynnościami, które należy wykonać podczas migracji.
Stara wersja | Nowość | Uwagi |
---|---|---|
Obiekt GoogleAuth i powiązane z nimi metody: | ||
GoogleAuth.attachClickHandler() | Usuń | |
GoogleAuth.currentUser.get() | Usuń | |
GoogleAuth.currentUser.listen() | Usuń | |
GoogleAuth.disconnect() | google.accounts.oauth2.revoke | Zamień stare na nowe. Możesz je też anulować na stronie https://myaccount.google.com/permissions. |
GoogleAuth.grantOfflineAccess() | Usuń, postępuj zgodnie z instrukcjami dotyczącymi kodu autoryzacji. | |
GoogleAuth.isSignedIn.get() | Usuń | |
GoogleAuth.isSignedIn.listen() | Usuń | |
GoogleAuth.signIn() | Usuń | |
GoogleAuth.signOut() | Usuń | |
GoogleAuth.then() | Usuń | |
Obiekt GoogleUser i powiązane z nim metody: | ||
GoogleUser.disconnect() | google.accounts.id.revoke | Zamień stare na nowe. Możesz je też anulować na stronie https://myaccount.google.com/permissions. |
GoogleUser.getAuthResponse() | requestCode() or requestAccessToken() | Zamień stare na nowe |
GoogleUser.getBasicProfile() | Usuń. Zamiast tego użyj identyfikatora tokena, aby dowiedzieć się więcej o migracji z Logowaniem przez Google. | |
GoogleUser.getGrantedScopes() | hasGrantedAnyScope() | Zamień stare na nowe |
GoogleUser.getHostedDomain() | Usuń | |
GoogleUser.getId() | Usuń | |
GoogleUser.grantOfflineAccess() | Usuń, postępuj zgodnie z instrukcjami dotyczącymi kodu autoryzacji. | |
GoogleUser.grant() | Usuń | |
GoogleUser.hasGrantedScopes() | hasGrantedAnyScope() | Zamień stare na nowe |
GoogleUser.isSignedIn() | Usuń | |
GoogleUser.reloadAuthResponse() | requestAccessToken() | Usuń stary, wywołaj nowy, aby zastąpić wygasły lub unieważniony token dostępu. |
Obiekt gapi.auth2 i powiązane z nim metody: | ||
Obiekt gapi.auth2.AuthorizeConfig | TokenClientConfig lub CodeClientConfig | Zamień stare na nowe |
Obiekt gapi.auth2.AuthorizeResponse | Usuń | |
Obiekt gapi.auth2.AuthResponse | Usuń | |
gapi.auth2.authorize() | requestCode() or requestAccessToken() | Zamień stare na nowe |
gapi.auth2.ClientConfig() | TokenClientConfig lub CodeClientConfig | Zamień stare na nowe |
gapi.auth2.getAuthInstance() | Usuń | |
gapi.auth2.init() | initTokenClient() or initCodeClient() | Zamień stare na nowe |
Obiekt gapi.auth2.OfflineAccessOptions | Usuń | |
Obiekt gapi.auth2.SignInOptions | Usuń | |
Obiekt gapi.signin2 i powiązane metody: | ||
gapi.signin2.render() | Usuń. Wczytanie HTML DOM interfejsu g_id_signin element lub wywołanie JS do google.accounts.id.renderButton powoduje logowanie użytkownika na konto Google. |
Przykładowe dane logowania
Istniejące dane logowania
bibliotekę Google Sign-In, bibliotekę klienta interfejsów API Google dla JavaScript lub bezpośrednie wywołania punktów końcowych Google Auth 2.0 token dostępu OAuth 2.0 i token identyfikatora OpenID Connect w jednym .
Przykładowa odpowiedź zawierająca elementy access_token
i id_token
:
{
"token_type": "Bearer",
"access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
"expires_in": 3599,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
"session_state": {
"extraQueryParams": {
"authuser": "0"
}
},
"first_issued_at": 1638991637982,
"expires_at": 1638995236982,
"idpId": "google"
}
Dane logowania w usługach tożsamości Google
Biblioteka usług tożsamości Google zwraca:
token dostępu używany do autoryzacji:
{ "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g", "token_type": "Bearer", "expires_in": 3599, "scope": "https://www.googleapis.com/auth/calendar.readonly" }
lub token tożsamości używany do uwierzytelniania:
{ "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com", "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ", "select_by": "user" }
Nieprawidłowa odpowiedź tokena
Przykładowa odpowiedź od Google przy próbie wysłania żądania do interfejsu API za pomocą wygasł, unieważniony lub nieprawidłowy token dostępu:
Nagłówki odpowiedzi HTTP
www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"
Treść odpowiedzi
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Invalid Credentials",
"domain": "global",
"reason": "authError",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}