W tym artykule znajdziesz opis metod i atrybutów klienta JavaScript, które będziesz wykorzystywać do implementacji Logowania przez Google w swoich aplikacjach internetowych.
Jeśli napotkasz problem z biblioteką, zgłoś go w naszym repozytorium GitHub.
Konfiguracja uwierzytelniania
Wczytaj bibliotekę platformy interfejsów API Google, aby utworzyć obiekt gapi
:
<script src="https://apis.google.com/js/platform.js?onload=init" async defer></script>
Po wczytaniu biblioteki platformy wczytaj bibliotekę auth2
:
function init() {
gapi.load('auth2', function() {
/* Ready. Make a call to gapi.auth2.init or some other API */
});
}
gapi.auth2.init(params)
Inicjuje obiekt GoogleAuth
. Musisz wywołać tę metodę przed wywołaniem metod metody gapi.auth2.GoogleAuth
.
Gdy zainicjujesz obiekt GoogleAuth
, skonfigurujesz go przy użyciu identyfikatora klienta OAuth 2.0 i dodatkowych opcji, które chcesz określić. Jeśli użytkownik się już zalogował, obiekt GoogleAuth
przywraca stan logowania użytkownika z poprzedniej sesji.
Argumenty | |
---|---|
params |
Obiekt zawierający pary klucz-wartość danych konfiguracyjnych klienta. Różne właściwości, które można skonfigurować, znajdziesz w sekcji gapi.auth2.ClientConfig . Przykład:
{ client_id: 'CLIENT_ID.apps.googleusercontent.com' } |
Zwroty | |
---|---|
gapi.auth2.GoogleAuth |
Obiekt gapi.auth2.GoogleAuth . Użyj metody then(), aby uzyskać obietnicę, która zostanie zrealizowana po zakończeniu inicjowania obiektu gapi.auth2.GoogleAuth .
|
GoogleAuth.then(onInit, onError)
Wywołuje funkcję onInit po pełnym zainicjowaniu obiektu GoogleAuth
. Jeśli podczas inicjowania wystąpi błąd (może się to zdarzyć w starszych nieobsługiwanych przeglądarkach), zamiast tego zostanie wywołana funkcja onError.
Argumenty | |
---|---|
onInit |
Funkcja wywoływana za pomocą obiektu GoogleAuth po pełnym zainicjowaniu.
|
onError |
Funkcja jest wywoływana za pomocą obiektu zawierającego właściwość error , jeśli nie udało się zainicjować elementu GoogleAuth .
|
Zwroty | |
---|---|
Obietnica | Promise , który jest wypełniany po zakończeniu funkcji onInit lub odrzucony, jeśli wystąpił błąd inicjowania. Rozwiązuje się za pomocą wartości zwróconej z funkcji onInit (jeśli istnieje). |
Kody błędów
idpiframe_initialization_failed
- Nie udało się zainicjować wymaganego elementu iframe od Google, np. z powodu nieobsługiwanego środowiska. Więcej informacji o zgłoszonym błędzie znajdziesz w usłudze
details
.
gapi.auth2.ClientConfig
Interfejs, który reprezentuje różne parametry konfiguracji metody gapi.auth2.init
.
Parametry | ||
---|---|---|
client_id |
string |
Wymagane. Identyfikator klienta aplikacji znaleziony i utworzony w Google Developers Console. |
cookie_policy |
string |
Domeny, dla których są tworzone pliki cookie logowania. Identyfikator URI, single_host_origin lub none . Jeśli nie określono inaczej, domyślna wartość to single_host_origin . |
scope |
string |
Zakresy do żądania w postaci ciągu rozdzielanego spacjami. Opcjonalne, jeśli fetch_basic_profile nie ma wartości false (fałsz). |
fetch_basic_profile |
boolean |
Pobieranie podstawowych informacji o profilach użytkowników podczas logowania. Dodaje wartości „profile”, „email” i „openid” do żądanych zakresów. Prawda, jeśli nie określono inaczej. |
hosted_domain |
string |
Domena G Suite, w której użytkownicy muszą się zalogować. Klienci mogą go modyfikować, więc pamiętaj o sprawdzeniu usługi hostowanej domeny zwróconego użytkownika. Użyj GoogleUser.getHostedDomain() na kliencie i deklaracji hd w tokenie identyfikatora na serwerze, aby potwierdzić, że domena jest zgodna z oczekiwaniami.
|
ux_mode |
string |
Tryb UX używany podczas logowania. Domyślnie otworzy się ona w wyskakującym okienku. Prawidłowe wartości to popup i redirect . |
redirect_uri |
string |
Jeśli używasz parametru ux_mode='redirect' , ten parametr umożliwia zastąpienie domyślnej wartości redirect_uri , która będzie używana na koniec procesu uzyskiwania zgody na wykorzystanie danych. Domyślnym ustawieniem redirect_uri jest bieżący adres URL bez parametrów zapytania i fragmentu z krzyżykiem.
|
enable_granular_consent |
boolean |
Opcjonalnie. Określa, czy włączyć szczegółowe uprawnienia. Jeśli ustawisz wartość false , tym bardziej szczegółowe uprawnienia do konta Google zostaną wyłączone w przypadku identyfikatorów klienta OAuth utworzonych przed 2019 rokiem. Brak wpływu na identyfikatory klienta OAuth utworzone w 2019 r. lub później, ponieważ zawsze są w nich włączone bardziej szczegółowe uprawnienia.
|
plugin_name |
string |
Opcjonalnie. Jeśli ta wartość jest ustawiona, nowe identyfikatory klientów utworzone przed 29 lipca 2022 r. mogą używać starszej biblioteki Google Platform.
Domyślnie nowo utworzone identyfikatory klientów są teraz blokowane i nie mogą korzystać z Biblioteki platform. Zamiast tego muszą korzystać z nowszej biblioteki usług tożsamości Google. Możesz wybrać dowolną wartość. Aby ułatwić identyfikację, zalecamy użycie nazwy opisowej, na przykład nazwy produktu lub wtyczki.
Przykład: plugin_name: 'YOUR_STRING_HERE'
|
Uwierzytelnianie
GoogleAuth
to jednorazowa klasa, która udostępnia metody umożliwiające użytkownikowi zalogowanie się na konto Google, sprawdzenie jego aktualnego stanu logowania, pobranie określonych danych z profilu Google użytkownika, wysłanie prośby o dodatkowe zakresy i wylogowanie się z bieżącego konta.
gapi.auth2.getAuthInstance()
Zwraca obiekt GoogleAuth
. Przed wywołaniem tej metody musisz zainicjować obiekt GoogleAuth
za pomocą gapi.auth2.init()
.
Zwroty | |
---|---|
gapi.auth2.GoogleAuth |
Obiekt gapi.auth2.GoogleAuth . Używaj tego obiektu do wywoływania metod obiektu gapi.auth2.GoogleAuth .
|
GoogleAuth.isSignedIn.get()
Wskazuje, czy bieżący użytkownik jest obecnie zalogowany.
Zwroty | |
---|---|
Wartość logiczna |
true , jeśli użytkownik jest zalogowany, lub false , jeśli użytkownik nie jest zalogowany lub obiekt GoogleAuth nie został zainicjowany.
|
GoogleAuth.isSignedIn.listen(listener)
Wykrywaj zmiany stanu logowania bieżącego użytkownika.
Argumenty | |
---|---|
listener |
Funkcja, która przyjmuje wartość logiczną. listen() przekazuje do tej funkcji true , gdy użytkownik się zaloguje, i false , gdy użytkownik się wyloguje.
|
GoogleAuth.signIn()
Loguje użytkownika z opcjami określonymi jako gapi.auth2.init()
.
Zwroty | |
---|---|
Obietnica | Promise , który jest wypełniany z instancją GoogleUser , gdy użytkownik uwierzytelni się i przyzna żądane zakresy, lub został odrzucony za pomocą obiektu zawierającego właściwość error , jeśli wystąpił błąd (kody błędów znajdziesz poniżej). |
Kody błędów
Zobacz GoogleAuth.signIn(options)
.
GoogleAuth.signIn(options)
Loguje użytkownika przy użyciu określonych opcji.
Argumenty | |
---|---|
options |
Wykonaj 1 z tych czynności:
|
Zwroty | |
---|---|
Obietnica | Promise , który jest wypełniany z instancją GoogleUser , gdy użytkownik uwierzytelni się i przyzna żądane zakresy, lub został odrzucony za pomocą obiektu zawierającego właściwość error , jeśli wystąpił błąd (kody błędów znajdziesz poniżej). |
Kody błędów
popup_closed_by_user
- Użytkownik zamknął wyskakujące okienko przed zakończeniem procesu logowania.
access_denied
- Użytkownik odmówił przyznania uprawnień do wymaganych zakresów.
immediate_failed
- Nie udało się automatycznie wybrać żadnego użytkownika bez wyświetlenia prośby o zgodę na wykorzystanie danych. Podczas korzystania z
signIn
z opcjąprompt: 'none'
zgłaszany błąd. Nie musisz korzystać z tej opcji, ponieważgapi.auth2.init
automatycznie zaloguje użytkownika, jeśli zalogował się on w poprzedniej sesji.
gapi.auth2.SignInOptions
Interfejs, który reprezentuje różne parametry konfiguracji metody GoogleAuth.signIn(options)
.
Parametry | ||
---|---|---|
prompt |
string |
Wymusza określony tryb procesu uzyskiwania zgody. Opcjonalnie. Możliwe wartości:
|
scope |
string |
Zakresy, do których chcesz wysłać żądanie w postaci ciągu rozdzielanego spacjami, na początku zakresów zdefiniowanych w parametrach gapi.auth2.init . Opcjonalne, jeśli fetch_basic_profile nie ma wartości false (fałsz).
|
ux_mode |
string |
Tryb UX używany podczas logowania. Domyślnie otworzy się ona w wyskakującym okienku. Prawidłowe wartości to popup i redirect . |
redirect_uri |
string |
Jeśli używasz parametru ux_mode='redirect' , ten parametr umożliwia zastąpienie domyślnej wartości redirect_uri , która będzie używana na koniec procesu uzyskiwania zgody. Domyślny redirect_uri to bieżący adres URL bez parametrów zapytania i fragmentu z krzyżykiem.
|
GoogleAuth.signOut()
Wylogowuje bieżące konto z aplikacji.
Zwroty | |
---|---|
Obietnica | Wartość Promise , która jest wypełniana, gdy użytkownik wyloguje się. |
GoogleAuth.disconnect()
Unieważnia wszystkie zakresy przyznane przez użytkownika.
GoogleAuth.grantOfflineAccess(options)
Uzyskaj od użytkownika uprawnienia dostępu do określonych zakresów w trybie offline.
Argumenty | |
---|---|
options |
Obiekt gapi.auth2.OfflineAccessOptions zawierający pary klucz-wartość parametrów. Przykład: { scope: 'profile email' } |
Zwroty | |
---|---|
Obietnica | Promise , który jest wykonywany, gdy użytkownik przyzna żądane zakresy, przekazując obiekt zawierający kod autoryzacji do modułu obsługi realizacji Promise .
Przykład: auth2.grantOfflineAccess().then(function(resp) { var auth_code = resp.code; }); |
Kody błędów
popup_closed_by_user
- Użytkownik zamknął wyskakujące okienko przed zakończeniem procesu uzyskiwania zgody.
access_denied
- Użytkownik odmówił przyznania uprawnień do wymaganych zakresów.
immediate_failed
- Nie udało się automatycznie wybrać żadnego użytkownika bez wyświetlenia prośby o zgodę na wykorzystanie danych. Podczas korzystania z
signIn
z opcjąprompt: 'none'
zgłaszany błąd. Nie musisz korzystać z tej opcji, ponieważgapi.auth2.init
automatycznie zaloguje użytkownika, jeśli zalogował się on w poprzedniej sesji.
gapi.auth2.OfflineAccessOptions
Interfejs, który reprezentuje różne parametry konfiguracji metody GoogleAuth.grantOfflineAccess(options)
.
Parametry | ||
---|---|---|
prompt |
string |
Wymusza określony tryb procesu uzyskiwania zgody. Opcjonalnie. Możliwe wartości:
|
scope |
string |
Zakresy, do których chcesz wysłać żądanie w postaci ciągu rozdzielanego spacjami, na początku zakresów zdefiniowanych w parametrach gapi.auth2.init . Opcjonalne, jeśli fetch_basic_profile nie ma wartości false (fałsz).
|
GoogleAuth.attachClickHandler(container, options, onsuccess, onfailure)
Dołącza proces logowania do modułu obsługi kliknięcia określonego kontenera.
Argumenty | |
---|---|
container | Identyfikator elementu div lub odwołanie do niego, do którego ma być dołączony moduł obsługi kliknięcia. |
options | Obiekt zawierający pary klucz-wartość parametrów. Zobacz GoogleAuth.signIn(). |
onsuccess | Funkcja, która zostanie wywołana po zakończeniu logowania. |
onfailure | Funkcja, która zostanie wywołana w przypadku niepowodzenia logowania. |
Użytkownicy
Obiekt GoogleUser
reprezentuje jedno konto użytkownika.
Obiekty GoogleUser
są zwykle uzyskiwane przez wywołanie GoogleAuth.currentUser.get().
GoogleAuth.currentUser.get()
Zwraca obiekt GoogleUser
, który reprezentuje obecnego użytkownika. W nowo zainicjowanej instancji GoogleAuth
bieżący użytkownik nie został ustawiony. Aby uzyskać zainicjowaną instancję GoogleAuth
, użyj metody currentUser.listen()
lub GoogleAuth.then()
.
Zwroty | |
---|---|
GoogleUser |
Bieżący użytkownik |
GoogleAuth.currentUser.listen(listener)
Wykrywaj zmiany w bieżącym koncie użytkownika.
Argumenty | |
---|---|
listener |
Funkcja, która przyjmuje parametr GoogleUser .
listen przekazuje tę funkcję do instancji GoogleUser przy każdej zmianie, która zmienia currentUser .
|
GoogleUser.getId()
Pobierz unikalny ciąg identyfikatora użytkownika.
Zwroty | |
---|---|
Ciąg znaków | Unikalny identyfikator użytkownika |
GoogleUser.isSignedIn()
Zwraca wartość „true”, jeśli użytkownik jest zalogowany.
Zwroty | |
---|---|
Wartość logiczna | Prawda, jeśli użytkownik jest zalogowany |
GoogleUser.getHostedDomain()
Uzyskaj domenę G Suite użytkownika, jeśli użytkownik zalogował się na konto G Suite.
Zwroty | |
---|---|
Ciąg znaków | Domena G Suite użytkownika |
GoogleUser.getGrantedScopes()
Pobierz zakresy przyznane przez użytkownika w postaci ciągu rozdzielanego spacjami.
Zwroty | |
---|---|
Ciąg znaków | Zakresy przyznane przez użytkownika |
GoogleUser.getBasicProfile()
Pobierz podstawowe informacje z profilu użytkownika.
Zwroty | |
---|---|
gapi.auth2.BasicProfile |
Właściwości obiektu gapi.auth2.BasicProfile możesz pobierać za pomocą tych metod:
|
GoogleUser.getAuthResponse(includeAuthorizationData)
Pobierz obiekt odpowiedzi z sesji uwierzytelniania użytkownika.
Argumenty | |
---|---|
includeAuthorizationData | Opcjonalne: wartość logiczna określająca, czy zawsze zwracać token dostępu i zakresy. Domyślnie token dostępu i żądane zakresy nie są zwracane, gdy fetch_basic_profile ma wartość prawda (wartość domyślna) i nie są żądane dodatkowe zakresy. |
Zwroty | |
---|---|
gapi.auth2.AuthResponse |
Obiekt gapi.auth2.AuthResponse . |
GoogleUser.reloadAuthResponse()
Wymusza odświeżenie tokena dostępu, a następnie zwraca obietnicę nowej odpowiedzi AuthResponse.
Zwroty | |
---|---|
Promise |
Wykonana jest operacja Promise , która jest wypełniana za pomocą załadowanego ponownie klucza gapi.auth2.AuthResponse podczas ponownego ładowania tokena OAuth.
|
gapi.auth2.AuthResponse
Odpowiedź zwrócona podczas wywoływania metod GoogleUser.getAuthResponse(includeAuthorizationData)
lub GoogleUser.reloadAuthResponse()
.
Właściwości | ||
---|---|---|
access_token |
string |
Przyznano token dostępu. |
id_token |
string |
Przyznano token identyfikatora. |
scope |
string |
Zakresy przyznane w tokenie dostępu. |
expires_in |
number |
Liczba sekund do wygaśnięcia tokena dostępu. |
first_issued_at |
number |
Sygnatura czasowa, kiedy użytkownik po raz pierwszy przyznał żądane zakresy. |
expires_at |
number |
Sygnatura czasowa wygaśnięcia tokena dostępu. |
GoogleUser.hasGrantedScopes(scopes)
Zwraca wartość „true”, jeśli użytkownik przyznał określone zakresy.
Argumenty | |
---|---|
scopes | Ciąg znaków zawierający rozdzielone spacjami. |
Zwroty | |
---|---|
Wartość logiczna | Prawda, jeśli zakresy zostały przyznane |
GoogleUser.grant(options)
Wyślij do użytkownika prośbę o dodatkowe zakresy.
Listę parametrów i kod błędu znajdziesz na stronie GoogleAuth.signIn()
.
GoogleUser.grantOfflineAccess(options)
Uzyskaj od użytkownika uprawnienia dostępu do określonych zakresów w trybie offline.
Argumenty | |
---|---|
options |
Obiekt gapi.auth2.OfflineAccessOptions zawierający pary klucz-wartość parametrów. Przykład: { scope: 'profile email' } |
GoogleUser.disconnect()
Unieważnia wszystkie zakresy, które użytkownik przyznał aplikacji.
Elementy interfejsu
gapi.signin2.render(id, options)
Renderuje przycisk logowania w elemencie o podanym identyfikatorze przy użyciu ustawień określonych przez obiekt options.
Argumenty | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | Identyfikator elementu, w którym ma być renderowany przycisk logowania. | ||||||||||||||||
options |
Obiekt zawierający ustawienia służące do renderowania przycisku. Przykład:
{ scope: 'email', width: 200, height: 50, longtitle: true, theme: 'dark', onsuccess: handleSuccess, onfailure: handleFailure }Możesz określić te opcje:
|
Zaawansowane
gapi.auth2.authorized(params, callback)
Przeprowadza jednorazową autoryzację OAuth 2.0. W zależności od używanych parametrów otworzy się wyskakujące okienko z prośbą o zalogowanie się przez Google lub spróbuje wczytać żądaną odpowiedź po cichu, bez działań ze strony użytkownika.
Oto kilka przypadków użycia tej metody:
- Aplikacja wysyła żądanie do punktu końcowego interfejsu API Google tylko raz, na przykład w celu wczytania ulubionych filmów użytkownika w YouTube przy pierwszym logowaniu.
- Twoja aplikacja ma własną infrastrukturę zarządzania sesjami i wymaga tylko jednego tokena identyfikatora do identyfikacji użytkownika w backendzie.
- Na jednej stronie używa się kilku identyfikatorów klienta.
Argumenty | |
---|---|
params |
Obiekt zawierający pary klucz-wartość danych konfiguracji. Różne właściwości, które można skonfigurować, znajdziesz w sekcji gapi.auth2.AuthorizeConfig . Przykład:
{ client_id: 'CLIENT_ID.apps.googleusercontent.com', scope: 'email profile openid', response_type: 'id_token permission' } |
callback |
Funkcja wywoływana z obiektem gapi.auth2.AuthorizeResponse po wykonaniu żądania (pomyślnie lub w przypadku niepowodzenia).
|
Przykład
gapi.auth2.authorize({
client_id: 'CLIENT_ID.apps.googleusercontent.com',
scope: 'email profile openid',
response_type: 'id_token permission'
}, function(response) {
if (response.error) {
// An error happened!
return;
}
// The user authorized the application for the scopes requested.
var accessToken = response.access_token;
var idToken = response.id_token;
// You can also now use gapi.client to perform authenticated requests.
});
Kody błędów
idpiframe_initialization_failed
- Nie udało się zainicjować wymaganego elementu iframe od Google, np. z powodu nieobsługiwanego środowiska. Więcej informacji o zgłoszonym błędzie znajdziesz w usłudze
details
. popup_closed_by_user
- Użytkownik zamknął wyskakujące okienko przed zakończeniem procesu logowania.
access_denied
- Użytkownik odmówił przyznania uprawnień do wymaganych zakresów.
immediate_failed
- Nie udało się automatycznie wybrać żadnego użytkownika bez wyświetlenia prośby o zgodę na wykorzystanie danych. Podczas korzystania z
signIn
z opcjąprompt: 'none'
zgłaszany błąd.
gapi.auth2.AuthorizeConfig
Interfejs, który reprezentuje różne parametry konfiguracji metody gapi.auth2.authorize
.
Właściwości | ||
---|---|---|
client_id |
string |
Wymagany. Identyfikator klienta aplikacji znaleziony i utworzony w Google Developers Console. |
scope |
string |
Wymagany. Zakresy do żądania w postaci ciągu rozdzielanego spacjami. |
response_type |
string |
Lista typów odpowiedzi rozdzielonych spacjami. Domyślna wartość to 'permission' . Możliwe wartości:
|
prompt |
string |
Wymusza określony tryb procesu uzyskiwania zgody. Możliwe wartości:
|
cookie_policy |
string |
Domeny, dla których są tworzone pliki cookie logowania. Identyfikator URI, single_host_origin lub none . Jeśli nie określono inaczej, domyślna wartość to single_host_origin .
|
hosted_domain |
string |
Domena G Suite, w której użytkownicy muszą się zalogować. Klienci mogą go modyfikować, dlatego pamiętaj o sprawdzeniu usługi hostowanej domeny zwróconego użytkownika. |
login_hint |
string |
Adres e-mail lub identyfikator użytkownika, który ma zostać wstępnie wybrany podczas logowania. Użytkownik może go zmienić, chyba że używany jest mechanizm prompt: "none" .
|
include_granted_scopes |
boolean |
Określa, czy chcesz poprosić o token dostępu obejmujący wszystkie zakresy przyznane wcześniej przez użytkownika aplikacji, czy tylko zakresy żądane w bieżącym wywołaniu. Domyślna wartość to true .
|
enable_granular_consent |
boolean |
Opcjonalnie. Określa, czy włączyć szczegółowe uprawnienia. Jeśli ustawisz wartość false , tym bardziej szczegółowe uprawnienia do konta Google zostaną wyłączone w przypadku identyfikatorów klienta OAuth utworzonych przed 2019 rokiem. Brak wpływu na identyfikatory klienta OAuth utworzone w 2019 r. lub później, ponieważ zawsze są w nich włączone bardziej szczegółowe uprawnienia.
|
plugin_name |
string |
Opcjonalnie. Jeśli są ustawione, identyfikatory klientów utworzone przed 29 lipca 2022 r. będą mogły używać biblioteki Google Platform. Domyślnie nowo utworzone identyfikatory klientów są blokowane w bibliotece Platform i muszą korzystać z nowszej biblioteki usług tożsamości Google. Możesz wybrać dowolną wartość. Aby ułatwić identyfikację, zalecamy użycie nazwy opisowej, np. nazwy produktu lub wtyczki.
Przykład: plugin_name: 'YOUR_STRING_HERE'
|
gapi.auth2.AuthorizeResponse
Odpowiedź została zwrócona na wywołanie zwrotne metody gapi.auth2.authorize
.
Właściwości | ||
---|---|---|
access_token |
string |
Przyznano token dostępu. Widoczny tylko wtedy, gdy w response_type określono właściwość permission lub token .
|
id_token |
string |
Przyznano token identyfikatora. Widoczny tylko wtedy, gdy w response_type określono id_token .
|
code |
string |
Przyznano kod autoryzacji. Widoczny tylko wtedy, gdy w response_type określono code .
|
scope |
string |
Zakresy przyznane w tokenie dostępu. Widoczny tylko wtedy, gdy w response_type określono właściwość permission lub token .
|
expires_in |
number |
Liczba sekund do wygaśnięcia tokena dostępu. Występuje tylko wtedy, gdy w komponencie response_type określono permission lub token .
|
first_issued_at |
number |
Sygnatura czasowa, kiedy użytkownik po raz pierwszy przyznał żądane zakresy. Występuje tylko wtedy, gdy w komponencie response_type określono permission lub token .
|
expires_at |
number |
Sygnatura czasowa wygaśnięcia tokena dostępu. Występuje tylko wtedy, gdy w komponencie response_type określono permission lub token .
|
error |
string |
Jeśli żądanie nie zostało zrealizowane, zawiera kod błędu. |
error_subtype |
string |
Jeśli żądanie nie zostało zrealizowane, może zawierać dodatkowe informacje o zwróconym kodzie błędu. |