In OpenID Connect hat ein Zugriffstoken eine Ablaufzeit. Für den Fluss des Autorisierungscodes ist dies normalerweise kurz (z. B. 20 Minuten). Danach verwenden Sie das Aktualisierungstoken, um ein neues Zugriffstoken anzufordern.
Das ID-Token hat auch eine Ablaufzeit. Meine Frage ist, was ist die Absicht davon?
Jede ID-Token-Ablaufzeit, die kürzer als die Ablaufzeit des Aktualisierungstokens ist, bedeutet, dass Sie möglicherweise ein abgelaufenes ID-Token, aber ein gültiges Zugriffstoken haben.
Also sollst du:
- Geben Sie Ihrem ID-Token einen längeren Ablauf als den Ablauf des Aktualisierungstokens
- Stellen Sie den gleichen Ablauf wie das Zugriffstoken ein und ergreifen Sie Maßnahmen (was?), wenn es abläuft, oder
- Verbrauchen Sie einfach das ID-Token in Ihrem Client nach Erhalt und ignorieren Sie danach die Ablaufzeit?
Die OpenID Connect-Spezifikation besagt lediglich, dass bei der Validierung eines ID-Tokens
"The current time MUST be before the time represented by the exp Claim."
was (möglicherweise) die obige dritte Option unterstützt.
BEARBEITEN
Da OpenID Connect auf OAuth2 aufbaut, finden Sie die Antwort auf die folgende Zusatzfrage in der OAuth2-Spezifikation :
expires_in
RECOMMENDED. The lifetime in seconds of the access token.
Eine verwandte Frage ist, wenn Sie einen Autorisierungscode gegen die Token austauschen. Dieselbe Spezifikation besagt, dass Sie möglicherweise eine Antwort erhalten, wie zum Beispiel:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbG[...]"
}
Aber worauf bezieht sich "expires_in" in diesem Fall? Das Zugriffstoken, das Aktualisierungstoken oder das ID-Token?
(Zur Information setzt IdentityServer3 dies auf die Ablaufzeit des Zugriffstokens.)
quelle
Ich musste mich aus eigenen Gründen damit befassen und es aufschreiben, also werde ich hier posten, was ich gelernt habe ...
Zunächst beantworte ich die Frage mit dem Risiko, das Offensichtliche zu sagen: Dem ID-Token kann nicht vertraut werden, und sein Inhalt muss ignoriert werden, wenn die aktuelle Zeit größer als die abgelaufene Zeit ist. Die Antwort des Fragestellers besagt, dass das ID-Token nach der ersten Authentifizierung des Benutzers nicht mehr verwendet wird. Da das ID-Token jedoch vom Identitätsanbieter signiert ist , kann es durchaus jederzeit nützlich sein , anderen Diensten, die eine App möglicherweise verwendet, zuverlässig zu bestimmen, wer der Benutzer ist. Die Verwendung einer einfachen Benutzer-ID oder E-Mail-Adresse ist nicht zuverlässig da es leicht gefälscht werden kann (jeder kann eine E-Mail-Adresse oder Benutzer-ID senden), aber da ein OIDC-ID-Token vom Autorisierungsserver signiert ist (was normalerweise auch den Vorteil hat, ein Dritter zu sein), kann es nicht gefälscht werden und ist ein viel zuverlässigerer Authentifizierungsmechanismus.
Beispielsweise möchte eine mobile App möglicherweise einem Backend-Dienst mitteilen können, wer der Benutzer ist, der die App verwendet, und dies muss möglicherweise nach dem kurzen Zeitraum nach der Erstauthentifizierung erfolgen. Zu diesem Zeitpunkt ist das ID-Token abgelaufen. und kann daher nicht verwendet werden, um den Benutzer zuverlässig zu authentifizieren.
Können Sie daher genau wie das Zugriffstoken (das für die Autorisierung verwendet wird - Angabe der Berechtigungen des Benutzers) aktualisiert werden können, das ID-Token (für die Authentifizierung verwendet - Angabe, wer der Benutzer ist) aktualisieren ? Gemäß der OIDC-Spezifikation ist die Antwort nicht offensichtlich. In OIDC / OAuth gibt es drei "Flows" zum Abrufen von Token: den Authorization Code-Flow, den impliziten Flow und den Hybrid-Flow (den ich unten überspringen werde, da es sich um eine Variante der beiden anderen handelt).
Für den impliziten Ablauf in OIDC / OAuth fordern Sie das ID-Token am Autorisierungsendpunkt an, indem Sie den Benutzer im Browser zum Autorisierungsendpunkt umleiten und
id_token
als Wert desresponse_type
Anforderungsparameters angeben. Eine implizite Flow Successful Authentication-Antwort ist erforderlich, um die zu enthaltenid_token
.Für den Authentifizierungscode-Fluss gibt der Client
code
den Wert desresponse_type
Anforderungsparameters an, wenn der Benutzer zum Autorisierungsendpunkt umgeleitet wird. Eine erfolgreiche Antwort enthält einen Autorisierungscode. Der Client-Client sendet eine Anforderung an den Token-Endpunkt mit dem Autorisierungscode. Gemäß OIDC Core-Abschnitt 3.1.3.3 Erfolgreiche Token- Antwort MUSS die Antwort ein ID-Token enthalten .Auf diese Weise erhalten Sie für beide Flows zunächst das ID-Token, aber wie aktualisieren Sie es? OIDC Abschnitt 12: Verwenden von Aktualisierungstoken enthält die folgende Anweisung zur Antwort auf Aktualisierungstoken :
Es enthält möglicherweise kein ID-Token. Da keine Möglichkeit angegeben ist, das ID-Token einzuschließen, müssen Sie davon ausgehen, dass die Antwort das ID-Token nicht enthält. Technisch gesehen gibt es also keine spezifizierte Möglichkeit, ein ID-Token mithilfe eines Aktualisierungstokens zu "aktualisieren". Daher besteht die einzige Möglichkeit, ein neues ID-Token zu erhalten, darin, den Benutzer erneut zu autorisieren / zu authentifizieren, indem der Benutzer zum Autorisierungsendpunkt umgeleitet und der implizite Fluss oder Authentifizierungscodefluss wie oben beschrieben gestartet wird. Die OIDC-Spezifikation fügt
prompt
der Autorisierungsanforderung einen Anforderungsparameter hinzu, damit der Client anfordern kann, dass der Autorisierungsserver den Benutzer nicht mit einer Benutzeroberfläche auffordert, die Umleitung jedoch noch erfolgen muss.quelle
Wenn ich das richtig verstehe, kann gemäß dieser und der OpenID Connect Core 1.0-Spezifikation das ID-Token selbst in Cookies als Mechanismus zum Fortbestehen von Sitzungen gespeichert und mit jeder authentifizierungspflichtigen Anforderung an den Client gesendet werden. Der Client kann das ID-Token dann entweder lokal oder über den Verifizierungsendpunkt des Anbieters überprüfen (falls bereitgestellt, wie dies bei Google der Fall ist ). Wenn das Token abgelaufen ist, sollte es eine weitere Authentifizierungsanforderung stellen, außer diesmal mit
prompt=none
im URL-Parameter. Stellen Sie außerdem sicher, dass Sie das abgelaufene ID-Token imid_token_hint
Parameter senden , da der Anbieter sonst möglicherweise einen Fehler zurückgibt.Es scheint also natürlich, dass das ID-Token abläuft,
prompt=none
stellt jedoch sicher, dass das neue ID-Token ohne Benutzereingriff reibungslos abgerufen werden kann (es sei denn, der Benutzer ist natürlich von dieser OpenID abgemeldet).quelle
Es ist die gleiche Absicht: Sie können das nicht verwenden,
id_token
nachdem es abgelaufen ist. Der Hauptunterschied besteht darin, dassid_token
es sich um eine Datenstruktur handelt und Sie keine Server oder Endpunkte aufrufen müssen, da die Informationen im Token selbst codiert sind. Ein reguläresaccess_token
ist normalerweise ein undurchsichtiges Artefakt (wie eine GUID).Der Verbraucher des
id_token
muss immer die (Zeit-) Gültigkeit überprüfen.Ich bin nicht zu 100% mit IS vertraut, aber ich würde vermuten, dass es sich um ein Convenience-Feld handelt. Sie sollten den
exp
Anspruch immer überprüfen .quelle
Das Aktualisieren eines Tokens bedeutet, dass Sie es erneut verwenden können, um etwas vom Autorisierungsserver anzufordern (in diesem Fall das OP - der OpenID-Connect-Anbieter), AUCH WENN DER BENUTZER NICHT ANGEMELDET IST. Sie erlauben dies normalerweise nur für begrenzte Ressourcen und erst, nachdem sich der Benutzer angemeldet und mindestens einmal authentifiziert hat. Die Aktualisierungstoken selbst sollten ebenfalls zeitlich begrenzt sein.
Im impliziten OIDC- Ablauf rufen Sie den Autorisierungsendpunkt auf
und erhalten das ID-Token in der Antwort zusammen mit allen Bereichen und darin alle Anspruchsinformationen.
Nachfolgende Aufrufe einer API sollen mit Codefluss erfolgen .
Der implizite Fluss soll eine App nur für Javascript oder nur für Browser aktivieren. Keine App, die mit einem Server interagiert.
Selbst wenn es eine Möglichkeit gab, dieses Token zu "aktualisieren", sollten Sie es aus Sicherheitsgründen nicht zu lange leben lassen. Es wird von nicht autorisierten Benutzern gestohlen und wiederverwendet, die sich als ID ausgeben. Sie sollten dafür ein neues Login erzwingen.
Im Code-Fluss rufen Sie den Autorisierungsendpunkt des OP auf und erhalten einen Autorisierungscode (auch als Autorisierungstoken oder kurz Authcode bezeichnet). Dies sollte ähnlich wie das id_token ablaufen, das Sie aus denselben Gründen im impliziten Ablauf erhalten haben, und kann und sollte nicht erneuert werden.
Ihre Benutzeroberfläche oder App ruft dann den Token-Endpunkt des OP auf und erhält (manchmal nach der weiteren Zustimmung des Benutzers über eine Benutzeroberfläche, die Verwendung seiner eigenen Ressourcen auf dem OP-Server zu ermöglichen) beide:
Sie können dieses access_token aktualisieren, da es der API nur mitteilt, welche Ansprüche der Benutzer hat und welche Ressourcen (nach Bereichen und Ansprüchen der einzelnen Bereiche) der Benutzer Ihnen zugestimmt hat. Wie oben erläutert, dient dies dazu, den Zugriff auch dann zu ermöglichen, wenn der Benutzer nicht mehr angemeldet ist. Natürlich möchten Sie niemals zulassen, dass das id_token aktualisiert wird, da Sie keinen Identitätswechsel zulassen möchten, ohne sich anzumelden.
quelle
TLDR;
Überprüfen Sie das ID-Token, bevor Sie den darin enthaltenen Informationen vertrauen.
Mehr Details
Der Client soll das ID-Token validieren können, und der Client muss das ID-Token vor Vorgängen validieren, bei denen die Informationen des ID-Tokens verwendet werden .
Aus der OpenID Implicit Flow-Spezifikation :
Um dies zu bestätigen, wird in der OpenID Connect-Dokumentation von Google Folgendes zur Validierung von ID-Token angegeben:
Wenn unsere Clientanwendung basierend auf dem Inhalt des ID-Tokens eine Aktion ausführen soll, müssen wir das ID-Token erneut validieren.
quelle
Ich wollte diese Antwort als Kommentar veröffentlichen, aber da ich bei StackOverflow nicht sehr aktiv war, werde ich sie wahrscheinlich als alternative Antwort veröffentlichen.
Sie verwenden auch
id_token
als das ,id_token_hint
wenn der Benutzer aus einer Sitzung anmelden versuchen http://openid.net/specs/openid-connect-session-1_0.html . Ich glaube ehrlich gesagt nicht, dass es wirklich wichtig ist, wenn dasid_token
zu diesem Zeitpunkt abgelaufen ist, da Sie sich nur darum kümmern, einen bestimmten Benutzer abzumelden.quelle