2017-06-29 1 views
4

Ich verwende derzeit OpenID Connect/Oauth2 Impliziter Fluss in einer mobilen App. Ich richte eine Webansicht für den Benutzer ein, um sich einzuloggen und das Zugriffstoken und Ablaufdatum zu erhalten. Wenn das Zugriffstoken jedoch abläuft, muss ich den Benutzer bitten, sich erneut anzumelden? Oder gibt es eine Möglichkeit, ein neues Zugriffstoken automatisch mit dem aktuellen zu erhalten, ohne den Benutzer abzufragen. Ich denke, eine andere Option ist, den Token-Ablauf auf eine wirklich lange Zeit zu setzen, aber ich habe gelesen, dass dies eine schlechte Idee ist.So erhalten Sie ein neues Zugriffstoken in OpenID Connect/OAuth2 Impliziter Datenfluss

Fehle ich hier etwas?

+0

Haben Sie verwenden müssen gelesen werden das Webview und der implizite Flow oder ist es dein c hoice? –

+1

Ich versuche auf Couchbase Sync Gateway zuzugreifen, und basierend auf dieser Diskussion hatte ich in ihren Foren https: // Foren.couchbase.com/t/cbl-database-name/13233/18, scheint es, dass ich Implicit flow verwenden muss. Mein Identitätsanbieter (keycloak) empfiehlt die Verwendung seiner Web-Login/Registrierungsseiten - also Web-Ansicht. – tura08

Antwort

2

Da der implizite Fluss kein Aktualisierungstoken sendet (wie in section 9 von RFC6746 erläutert), ist die Verwendung von Aktualisierungstoken nicht möglich. Aber als Workaround kann man client credential grant verwenden, um ein Zugriffs-Token zu erhalten.

Eine praktikable Lösung besteht darin, zuerst dem impliziten Fluss zu folgen und den Client zu authentifizieren. Dann Client-Authentifizierung gewähren kann verwendet werden, um die erforderlichen API-Aufrufe zu tun.

Musterbestellung (von RFC6749)

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

rant_type=client_credentials 

Probe resposne (von RFC6749)

HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 
Cache-Control: no-store 
Pragma: no-cache 

{ 
    "access_token":"2YotnFZFEjr1zCsicMWpAA", 
    "token_type":"example", 
    "expires_in":3600, 
    "example_parameter":"example_value" 
} 

PS - Wenn Sie mit Autorisierungscode Fluss, können Sie refresh_token, um ein neues Zugriffstoken zu erhalten. Wie die Anfrage erstellt werden soll, ist erhältlich unter OAuth2 documentation. Beachten Sie, dass Ihre Autorisierungsantwort zu diesem Zweck ein `refresh_token 'enthalten sollte.

Ein Aktualisierungstoken sollte so geschützt sein, wie ein Berechtigungsnachweis für einen Benutzer. Mehr aus keycloak Dokumentation von here

Musterbestellung und eine Antwort (von RFC6749)

Anfrage

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA 

Antwort

HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-store 
Pragma: no-cache 

{ 
    "access_token": "TlBN45jURg", 
    "token_type": "Bearer", 
    "refresh_token": "9yNOxJtZa5", 
    "expires_in": 3600 
} 
+1

Mit "Implicit flow" gibt es keine Refresh Tokens. – tura08

+0

Okay, das habe ich in der Spezifikation verpasst. "Bei Verwendung des Impliziten-Genehmigungs-Typflusses wird ein Aktualisierungstoken nicht zurückgegeben, was eine Wiederholung des Autorisierungsprozesses erfordert, sobald das Zugriffstoken abgelaufen ist." Gibt es einen Grund, warum Sie Autorisierungscode nicht verwenden können? –

+1

Da ich es in Verbindung mit Couchbase Sync Gateway verwende - sie haben im Wesentlichen empfohlen, es zu verwenden. Siehe Foren Convo, die ich mit ihnen hatte - forums.couchbase.com/t/cbl-database-name/13233/18 – tura08

1

Die empfohlene Methode ist die Verwendung eines externen Browsers und des Autorisierungscodeflusses. Überprüfen Sie die OAuth 2.0 for Native Apps RFC. Für Android gibt es auch eine unterstützende Bibliothek AppAuth. Mit diesem Ablauf können Sie ein Aktualisierungstoken verwenden, um ein neues Zugriffstoken zu erhalten, aber es gibt ein Problem mit einem geheimen Client (normalerweise für den Zugriff/Tokenendpunkt erforderlich), da Sie es in einer mobilen App nicht sicher aufbewahren können der RFC).

Wenn Sie mit dem WebView und dem impliziten Fluss bleiben entscheiden, was nicht sicher ist (Ihre Anwendung kann das Passwort sehen) Sie die gleiche Technik wie in JavaScript-Anwendungen nutzen könnten - fordern Sie ein neues Token mit /auth?...&prompt=none URL, die zurückkehren ein neues Token, ohne den Benutzer nach Anmeldeinformationen zu fragen, wenn er dort noch eine offene Sitzung hat.

+0

Ich habe in Chrome benutzerdefinierte Registerkarten verwenden. leider glaube ich nicht, Keycloak erlaubt prompt = none. – tura08

+0

prompt = none kann nur verwendet werden, wenn Sie einen gültigen Benutzer im Identity-Provider-Status angemeldet haben. Sobald die Tokens abgelaufen sind, wird es keine gültige Sitzung mehr geben (so behandeln die meisten Identitätsanbieter). Daher kann prompt = none verwendet werden, bevor das Token abläuft. Refresh_tokens sind jedenfalls der richtige Weg –

Verwandte Themen