W OpenID Connect token dostępu ma czas ważności. W przypadku przepływu kodu autoryzacyjnego jest to zwykle krótkie (np. 20 minut), po czym należy użyć tokena odświeżania, aby zażądać nowego tokena dostępu.
ID tokena również ma czas ważności. Moje pytanie brzmi: jaki jest tego cel?
Dowolny czas wygaśnięcia tokena identyfikatora krótszy niż czas wygaśnięcia tokena odświeżania będzie oznaczać, że w końcu będziesz mieć wygasły token identyfikatora, ale ważny token dostępu.
Więc masz zamiar:
- nadaj swojemu tokenowi ID wygaśnięcie dłuższe niż wygaśnięcie tokenu odświeżania lub
- ustaw go na taki sam termin ważności jak token dostępu i podejmij jakąś akcję (co?), gdy wygaśnie lub
- po prostu zużyj token ID w swoim kliencie przy odbiorze, a następnie zignoruj czas wygaśnięcia po tym?
Specyfikacja OpenID Connect mówi tylko, że podczas walidacji tokenu identyfikatora
"The current time MUST be before the time represented by the exp Claim."
który (prawdopodobnie) obsługuje trzecią opcję powyżej.
EDYTOWAĆ
Ponieważ OpenID Connect opiera się na OAuth2, odpowiedź na dodatkowe pytanie poniżej można znaleźć w specyfikacji OAuth2, która mówi:
expires_in
RECOMMENDED. The lifetime in seconds of the access token.
Powiązane pytanie brzmi: kiedy wymieniasz kod autoryzacyjny na tokeny, ta sama specyfikacja mówi, że możesz otrzymać odpowiedź, taką jak:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbG[...]"
}
Ale do czego odnosi się „expires_in” w tym przypadku? Token dostępu, token odświeżania czy token ID?
(Aby uzyskać informacje, IdentityServer3 ustawia to na czas wygaśnięcia tokenu dostępu).
źródło
Musiałem się w to zagłębić z własnych powodów i napisałem, więc opublikuję tutaj, czego się nauczyłem ...
Najpierw odpowiem na pytanie, ryzykując stwierdzenie oczywistego: tokenowi ID nie można ufać, a jego zawartość należy zignorować, jeśli aktualny czas jest dłuższy niż czas, który upłynął. W odpowiedzi pytającego stwierdza się, że po wstępnym uwierzytelnieniu użytkownika token ID nie jest ponownie używany. Ponieważ jednak token identyfikatora jest podpisany przez dostawcę tożsamości, z pewnością przydatne w dowolnym momencie może być udostępnienie sposobu niezawodnego określenia, kim jest użytkownik, do innych usług, z których może korzystać aplikacja. Używanie prostego identyfikatora użytkownika lub adresu e-mail nie jest niezawodne ponieważ można go łatwo sfałszować (każdy może wysłać adres e-mail lub identyfikator użytkownika), ale ponieważ token OIDC ID jest podpisany przez serwer autoryzacji (który zwykle ma również tę zaletę, że jest stroną trzecią), nie można go sfałszować i jest znacznie bardziej niezawodny mechanizm uwierzytelniania.
Na przykład aplikacja mobilna może chcieć móc powiedzieć usłudze wewnętrznej bazy danych, kim jest użytkownik, który korzysta z aplikacji, i może to zrobić po krótkim okresie po początkowym uwierzytelnieniu, w którym to momencie wygasł identyfikator tokenu, w związku z tym nie może służyć do wiarygodnego uwierzytelnienia użytkownika.
Dlatego tak jak token dostępu (służący do autoryzacji - określając jakie uprawnienia posiada użytkownik) można odświeżyć, czy można odświeżyć ID Token (służący do uwierzytelniania - określając, kim jest użytkownik)? Zgodnie ze specyfikacją OIDC odpowiedź nie jest oczywista. W OIDC / OAuth istnieją trzy „przepływy” do pobierania tokenów, przepływ kodu autoryzacji, przepływ niejawny i przepływ hybrydowy (które pominę poniżej, ponieważ jest to wariant dwóch pozostałych).
W przypadku niejawnego przepływu w OIDC / OAuth żądasz tokenu identyfikatora w punkcie końcowym autoryzacji, przekierowując użytkownika w przeglądarce do punktu końcowego autoryzacji i dołączając
id_token
jako wartośćresponse_type
parametru żądania. Niejawny Przepływ pomyślnym uwierzytelnieniu Response jest zobowiązany do obejmująid_token
.W przypadku przepływu kodu uwierzytelniania klient określa
code
jako wartośćresponse_type
parametru żądania podczas przekierowywania użytkownika do punktu końcowego autoryzacji. Pomyślna odpowiedź zawiera kod autoryzacji. Klient wysyła żądanie do punktu końcowego tokena z kodem autoryzacyjnym i, zgodnie z OIDC Core Section 3.1.3.3 Successful Token Response, odpowiedź MUSI zawierać ID Token .Tak więc w przypadku obu przepływów początkowo otrzymujesz token identyfikatora, ale jak go odświeżyć? Rozdział 12 OIDC: Używanie tokenów odświeżania zawiera następującą instrukcję dotyczącą odpowiedzi tokenu odświeżania:
To nie może zawierać identyfikator token, a ponieważ nie ma sposobu, aby zmusić go określono zawierać znacznik ID, należy założyć, że odpowiedź nie będzie zawierać identyfikator token. Z technicznego punktu widzenia nie ma więc określonego sposobu „odświeżenia” tokena identyfikatora za pomocą tokena odświeżania. Dlatego jedynym sposobem uzyskania nowego tokena identyfikatora jest ponowna autoryzacja / uwierzytelnienie użytkownika przez przekierowanie użytkownika do punktu końcowego autoryzacji i uruchomienie niejawnego przepływu lub przepływu kodu uwierzytelniającego, jak opisano powyżej. Specyfikacja OIDC dodaje
prompt
parametr żądania do żądania autoryzacji, więc klient może zażądać, aby serwer autoryzacji nie monitował użytkownika za pomocą żadnego interfejsu użytkownika, ale przekierowanie nadal musi nastąpić.źródło
Jeśli dobrze rozumiem, zgodnie z tym i specyfikacją OpenID Connect Core 1.0 , sam token ID może być przechowywany w plikach cookie jako mechanizm utrwalania sesji i wysyłany z każdym żądaniem uwierzytelniania do Klienta. Klient może następnie zweryfikować token identyfikatora lokalnie lub za pośrednictwem punktu końcowego weryfikatora dostawcy (jeśli jest dostępny, tak jak robi to Google ). Jeśli token stracił ważność, powinien wysłać kolejne żądanie uwierzytelnienia, z wyjątkiem tego czasu z
prompt=none
parametrem adresu URL. Upewnij się również, że wid_token_hint
parametrze wysłano wygasły token identyfikatora , w przeciwnym razie dostawca może zwrócić błąd.Tak więc wygaśnięcie
prompt=none
tokena ID wydaje się naturalne, ale zapewnia, że nowy token ID można uzyskać płynnie bez interwencji użytkownika (chyba że użytkownik zostanie wylogowany z tego OpenID).źródło
To ten sam cel: nie możesz użyć
id_token
po wygaśnięciu. Główną różnicą jest to, żeid_token
jest strukturą danych i nie musisz wywoływać żadnych serwerów ani punktów końcowych, ponieważ informacje są zakodowane w samym tokenie. Zwykłyaccess_token
jest zwykle nieprzezroczystym artefaktem (takim jak identyfikator GUID).Konsument
id_token
musi zawsze zweryfikować (czas) jej ważność.Nie jestem w 100% zaznajomiony z IS, ale myślę, że to wygoda. Zawsze powinieneś sprawdzić
exp
reklamację.źródło
Odświeżenie tokena oznacza, że można go ponownie użyć do zażądania czegoś od serwera autoryzacyjnego (w tym przypadku OP - dostawcy OpenID-Connect) NAWET GDY UŻYTKOWNIK NIE JEST ZALOGOWANY. Zwykle zezwalasz na to tylko w przypadku ograniczonych zasobów i tylko wtedy, gdy użytkownik zaloguje się i zostanie uwierzytelniony co najmniej raz. Same tokeny odświeżania również powinny być ograniczone w czasie.
W przepływie niejawnym OIDC wywołujesz punkt końcowy autoryzacji
i otrzymujesz token identyfikatora w odpowiedzi wraz ze wszystkimi zakresami i wszystkimi informacjami o oświadczeniach.
Kolejne wywołania interfejsu API mają być wykonywane za pomocą przepływu kodu .
Niejawny przepływ ma na celu włączenie aplikacji tylko javascript lub tylko przeglądarki. Nie jest to aplikacja, która wchodzi w interakcję z serwerem.
Więc nawet jeśli istniał sposób na „odświeżenie” tego tokena, nie należy - ze względów bezpieczeństwa - pozwolić mu żyć zbyt długo. Zostanie skradziony i ponownie wykorzystany przez nieautoryzowanych użytkowników podszywających się pod ten identyfikator. W tym celu należy wymusić nowy login.
W przepływie kodu wywołujesz punkt końcowy autoryzacji OP i otrzymujesz kod autoryzacji (zwany również tokenem autoryzacyjnym lub w skrócie authcode). Powinno to wygasnąć podobnie jak id_token, który otrzymałeś w niejawnym przepływie, z tych samych powodów i nie może i nie powinien być odnawiany.
Twój interfejs użytkownika lub aplikacja następnie wywołuje punkt końcowy tokenu OP i odbiera (czasami po dalszej zgodzie użytkownika za pośrednictwem interfejsu użytkownika, aby zezwolić na korzystanie z posiadanych zasobów na serwerze OP):
Możesz odświeżyć ten access_token, ponieważ informuje on tylko API, jakie roszczenia ma użytkownik i jakie zasoby (według zakresów i żądań każdego zakresu) zgodził się udostępnić. Jak wyjaśniono powyżej, służy to umożliwieniu dostępu nawet wtedy, gdy użytkownik nie jest już zalogowany. Oczywiście nigdy nie chcesz pozwolić na odświeżenie id_token, ponieważ nie chcesz zezwalać na podszywanie się bez logowania.
źródło
Chciałem opublikować tę odpowiedź jako komentarz, ale ponieważ nie byłem zbyt aktywny w StackOverflow, wydaje mi się, że publikuję ją jako alternatywną odpowiedź.
Używasz również
id_token
jako http://openid.net/specs/openid-connect-session-1_0.htmlid_token_hint
próbując wylogować użytkownika z sesji . Szczerze mówiąc, nie sądzę, aby to naprawdę miało znaczenie, jeśli w tym momencie wygasła, ponieważ martwisz się tylko wylogowaniem określonego użytkownika.id_token
źródło
TLDR;
Sprawdź poprawność tokenu ID, zanim zaufasz temu, co mówi.
Więcej szczegółów
Celem jest umożliwienie klientowi walidacji tokenu identyfikatora, a klient musi zweryfikować token identyfikatora przed operacjami, które wykorzystują informacje tokena identyfikatora .
Ze specyfikacji niejawnego przepływu OpenID :
Aby to potwierdzić, dokumentacja Google OpenID Connect mówi o weryfikacji tokenu identyfikacyjnego:
Tak więc, jeśli nasza aplikacja kliencka ma wykonać jakąś akcję w oparciu o zawartość tokena ID, musimy ponownie zweryfikować token ID.
źródło