Moderne Identifikationsstandards: OAuth 2.0, OpenID Connect, WebAuthn

Zu lassen oder nicht zu lassen? Das ist hier die Frage…

Jetzt sehen wir auf vielen Websites die Möglichkeit, sich über soziale Netzwerke zu registrieren oder anzumelden, und einige Websites bieten die Verwendung externer Sicherheitsschlüssel oder Fingerabdrücke an. Was ist das? Gut konzipierte Sicherheitsstandards oder proprietäre Implementierungen? Können wir diesen Technologien vertrauen und sie für die Entwicklung von Websites und im Alltag nutzen? Lass es uns richtig machen. Daher gibt es jetzt verschiedene Standards und Technologien zur Identifizierung von Benutzern von OAuth 2.0, OpenID Connect, WebAuthn, SAML 2.0, API für die Verwaltung von Anmeldeinformationen usw. In diesem Artikel werde ich auf die drei vielversprechendsten Protokolle OAuth 2.0, OpenID Connect und WebAuthn eingehen. Und um zu verstehen, wie man sie in die Praxis umsetzt, werden wir drei Laborarbeiten durchführen. Wir werden GitHub und Google als Plattformen zur Identifizierung von Nutzern verwenden.auf denen die meisten Konten haben.

Bild

OAuth 2.0


Beginnen wir mit dem bekanntesten OAuth 2.0-Protokoll. Es wurde 2012 als RFC 6749: The OAuth 2.0 Authorization Framework veröffentlicht .

Mit OAuth 2.0 ermöglicht ein Benutzer einer bestimmten Site, ihre privaten Daten aus sozialen Netzwerken zu empfangen, ohne jedoch ihre Anmeldungen / Kennwörter auf die Site zu übertragen. Wenn Sie sich beispielsweise über Facebook auf einer Website registrieren, erteilen Sie dieser Website lediglich die Erlaubnis, Ihren Namen, Ihre E-Mail-Adresse und andere private Daten von Facebook abzurufen.

Beschäftigen wir uns mit der technischen Implementierung. Der Einfachheit halber rufe ich jede Site auf, auf der Benutzeranmeldeinformationen im sozialen Netzwerk gespeichert sind. Und MySite benennt jede Site oder Anwendung, die Benutzerdaten aus dem sozialen Netzwerk abrufen möchte.

Bild

Der Standard definiert die folgenden Rollen:

  • Resource Owner — , MySite .
  • Client ( MySite) — , Authorization Server Resource Server .
  • Authorization Server — / , .
  • Resource Server — , API. Authorization Server Resource Server .

Authorization flow


  • MySite :
  • MySite Name ( ), Homepage ( MySite) Callback (, )
  • Das soziale Netzwerk gibt die Client-ID (manchmal auch als AppID bezeichnet) und das Client-Geheimnis aus.
  • Die Entwickler-ID muss in der Client-ID und im Client-Geheimnis registriert sein.

Nun der Prozess selbst. Die Details spezifischer Implementierungen können variieren, aber die allgemeine Logik lautet immer wie folgt:

Bild

  1. Der Ressourcenbesitzer meldet sich beim Client (MySite) an, wählt die Option "Mit dem sozialen Netzwerk anmelden" und leitet den Benutzer zum sozialen Netzwerk auf dem Autorisierungsserver weiter.
  2. Der Autorisierungsserver prüft, ob der Benutzer eine aktive Sitzung hat, und zeigt andernfalls das Anmeldeformular an.
  3. Der Ressourcenbesitzer gibt seinen Benutzernamen / sein Passwort ein und bestätigt, dass bestimmte private Daten von MySite verwendet werden können, z. B. Benutzername oder E-Mail-Adresse.
  4. Der Autorisierungsserver überprüft den Benutzer und leitet ihn mit dem Authentifizierungsergebnis und dem "Autorisierungscode" an die Rückrufadresse weiter.
  5. Client “Authorization Code”, Client ID Client Secret.
  6. Authorization Server “access token” JWT (JSON Web Token), . JWT “refresh token”, c .
  7. Client API, “access token”.
  8. Resource Server “access token” (, Authorization Server) .

OAuth 2.0 (GitHub)


Es gibt viele Anweisungen zum Implementieren der OAuth 2.0-Autorisierung in sozialen Netzwerken. Der folgende Artikel hat mir persönlich gefallen: Authentifizierung mit GitHub OAuth 2.0 mit NodeJS Er beschreibt die Schritte und bietet ein Testprogramm. Um den Algorithmus wirklich zu verstehen, ist es jedoch besser, alle Schritte mit den Händen durchzugehen (http-Anforderungen vom Browser oder Aufrufe zum Einrollen). Gehen.

Registrieren Sie zunächst Ihre Anwendung auf GitHub: github.com/settings/applications/new Legen

Sie die folgenden Parameter fest:


Damit die Berechtigung zum Arbeiten an einem eigenen Standort erteilt werden kann, müssen die Adressen echt sein. Dies ist jedoch für Laborarbeiten nicht erforderlich.

Holen Sie sich von GitHub:

  • Client-ID: ab8ec08a620c2
  • Kundengeheimnis: e6fdd52b0a99e8fbe76b05c1b7bb93c1e

Natürlich sind bei allen Laborarbeiten alle Werte falsch.

So sieht es aus, wenn Sie die Client-ID und das Geheimnis auf der GitHub-Website abrufen:

Bild

Jetzt beginnen wir mit der Autorisierung. Wir glauben, dass Schritt 1 bereits abgeschlossen ist: Der Benutzer hat sich bei MySite angemeldet und "Mit GitHub anmelden" ausgewählt. Schritt 2 des Anrufverlaufs ist ein Anruf im REST-Format:

https://github.com/login/oauth/authorize?client_id=ab8ec08a620c2


  • Die Adresse ist der Login-Punkt auf Github
  • client_id ist die bei der Registrierung ausgegebene Client-ID

Als Ergebnis dieses Aufrufs zeigt GitHub ein Fenster zur Autorisierung an:

Bild

Schritt 3: Geben Sie das Login / Passwort ein, um auf GitHub zuzugreifen.

Schritt 4: GitHub leitet die Anfrage an die Homepage weiter. In dieser Anfrage sehen wir Code:

http://MySite/home?code=a29b348f63d21

Unter dieser Adresse gibt es keine Arbeitsstelle, aber für uns ist es wichtig, den Code zu kennen, der für den nächsten Schritt 5 gesendet wird:

https://github.com/login/oauth/access_token?client_id=ab8ec08a620c2&
client_secret=e6fdd52b0a99e8fbe76b05c1b7bb93c1e&
code=a29b348f63d21

  • Die Adresse ist der Zugriffstoken-Empfangspunkt auf GitHub
  • client_id ist die bei der Registrierung ausgegebene Client-ID
  • client_secret ist ein Client-Geheimnis, das bei der Registrierung ausgegeben wird
  • Code ist der gerade gesendete Code

Schritt 6: Als Antwort erhalten Zugriffstoken:

access_token=31b71cbd372acdbb20ec1644b824f3dd0&scope=&token_type=bearer

Schritt 7: Fügen Sie das access_token in den Anforderungsheader ein und rufen Sie die GitHub-API auf:

curl -H "Authorization: token 31b71cbd372acdbb20ec1644b824f3dd0" https://api.github.com/user

Schritt 8: Als Antwort erhalten wir JSON mit nützlichen Informationen über mich, mit denen Sie ein Profil auf MySite erstellen können:

{
  "login": "AlexeySushkov",
  "html_url": "https://github.com/AlexeySushkov",
  "repos_url": "https://api.github.com/users/AlexeySushkov/repos",
  "name": "Alexey Sushkov",
  "blog": "http://sushkov.ru",
  "location": "St.Petersburg, Russia",
  "email": "alexey.p.sushkov@gmail.com",
 ..
}  

Tatsächlich haben wir nur ein OAuth 2.0-Szenario untersucht. Es gibt verschiedene Szenarien, die je nach Anwendung, Sicherheitsaspekten, Bereitstellungsmethode usw. verwendet werden. Eine Beschreibung aller Szenarien finden Sie beispielsweise hier: OAuth 2.0 auf den Punkt gebracht .

Openid verbinden


Mit OAuth 2.0 ein wenig verstanden. Lassen Sie uns nun herausfinden, warum wir OpenID Connect benötigen, ein Add-On für OAuth 2.0:

  • C OAuth 2.0 .. access token, . access token MySite. OpenID Connect — (identity). .
  • OpenID Connect “service discovery”. SSO (Single Sign-On), .

Schauen wir uns den Standard von der technischen Seite an.

OpenID Connect (OIDC) ist ein offener OpenID-Standard, der vom OpenID Foundation- Konsortium entwickelt wurde . OIDC erweitert OAuth 2.0 um die folgenden Hauptfunktionen:

  • Der Autorisierungsserver gibt zusätzlich zum Zugriffstoken und zum Aktualisierungstoken ein „Identitätstoken“ (ID-Token) zurück. Es ist in derselben JWT enthalten. Die folgenden Informationen können aus dem ID-Token extrahiert werden: Benutzername, Anmeldezeit, Ablaufdatum des ID-Tokens. Token-IDs können zwischen Teilnehmern übertragen werden.
  • OIDC bietet eine zusätzliche API, mit der Sie Informationen über den Benutzer und seine aktuellen Sitzungen anfordern können.

Das Interaktionsdiagramm in OpenID Connect sieht genauso aus wie bei OAuth. Der einzige Unterschied im Inhalt der Anfragen:

  • In der ersten Codeanforderung wird ein zusätzliches Attribut, scope = openid, hinzugefügt.
  • Als Ergebnis des Algorithmus erhält der Client zusätzlich zum Zugriff und zum Aktualisieren des Tokens eine Token-ID.

OpenID Connect: Lab (Google)


Nun wollen wir sehen, was Google uns zu diesem Thema gefallen wird. Es gibt detaillierte Anweisungen zum Konfigurieren und Verwenden von OpenID Connect von Google und eine Sandbox zur Verwendung der Google-API: Google OAuth 2.0 Playground .

Hier, wie im Fall von OAuth 2.0, werden wir die Schritte durchgehen und die eingehenden Daten betrachten. Ebenso glauben wir, dass die Anwendung registriert ist, die Kunden-ID und das Kundengeheimnis empfangen wurden und Schritt 1 bestanden wurde. Schritt 2 des Anrufverlaufs ist ein Anruf im REST-Format:

https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
client_id=140797064495-b8b79j42m97nkkrlndfstikv8.apps.googleusercontent.com&
scope=openid%20email&
redirect_uri=http%3A//c18529.shared.hc.ru/wp-login.php&
state=765439764

Google ist da etwas komplizierter Sie achten mehr auf die Sicherheit:

  • Adresse ist der Login-Punkt bei Google
  • response_type = code - Erwarten Sie, dass Sie als Antwort Code erhalten
  • client_id - Client-ID, die bei der Registrierung ausgegeben wurde
  • scope = openid email - auf welche Daten möchten wir zugreifen?
  • redirect_uri - redirect_uri, das bei der Registrierung der Anwendung angegeben wurde
  • state - Die vom Client generierte Nummer, die zum Schutz vor Eindringlingen zwischen Client und AS übertragen wird.

Schritt 3: Es gibt kein Passworteingabeformular Ich war bereits bei Google angemeldet.

Schritt 4: Google leitet die Anfrage an die Homepage weiter. In dieser Anfrage sehen wir Code:

http://MySite?state=123&code=4/xAFkcMzhyJhUErRJYwIyntSYN-WeJjfZHLiwWL4IaT-WkHzMU18xABlPmev-M_87wVbqTkQ1y93w6GB5&scope=email+openid+https://www.googleapis.com/auth/userinfo.email&authuser=0&prompt=none

Wie im Fall von GitHub gibt es unter dieser Adresse keine funktionierende Website, aber dies ist nicht erforderlich. Die Hauptsache für uns ist, den Code zu kennen, um den nächsten Schritt 5 zu bilden. Dies ist auch etwas komplizierter, weil Google benötigt eine POST-Anfrage, kein GET:

curl -d "code=4/xAFkcMzhyJhUErRJYwIyntSYN-WeJjfZHLiwWL4IaT-WkHzMU18xABlPmev-M_87wVbqTkQ1y93w6GB5&client_id=140797064495-b8b79j42m97nkkrlndfstikv8.apps.googleusercontent.com&
client_secret=HMVctrTicW6RC1Q8T&
redirect_uri=http%3A//c18529.shared.hc.ru/wp-login.php&
grant_type=authorization_code" 
-H "Content-Type: application/x-www-form-urlencoded" -X POST https://oauth2.googleapis.com/token

  • Adresse ist der Token-Empfangspunkt bei Google
  • Code ist der gerade gesendete Code
  • client_id ist die bei der Registrierung ausgegebene Client-ID
  • client_secret ist ein Client-Geheimnis, das bei der Registrierung ausgegeben wird
  • grant_type = authorisation_code - der einzig gültige Wert aus dem Standard

Schritt 6: Als Antwort erhalten access_token und id_token:

{
  "access_token": "ya29.Il_AB0KeKnjBJx0dhjm2nCLt1B-Mq0aQBW5T302JnlZfsxW1AXqLFfDJZRMi2R2WKG4OX4msKLjx4E4CSl4G_4ajAy3aqrf4pM0ic0jJr092pA67H9aktJktCbx",
  "expires_in": 3327,
  "scope": "openid https://www.googleapis.com/auth/userinfo.email",
  "token_type": "Bearer",
  "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3ZDU1ZmY0ZTEwOTkxZDZiMGVmZDM5MmI5MWEzM2U1
………………………………_…………………………………………………….._4mUTiMNSAHljap1hLD2hAzgOZWuQ"
}

Was tun mit diesem Reichtum?

Schritt 7: Mit access_token ist alles klar: Wir fügen es in einen API-Aufruf ein, zum Beispiel GMail:

curl -H "Authorization: Bearer ya29.a0Adw1xeWvFoxHKNICHnV6vFFj5TZdPQVlYD98h8wjW95ZEbHVui_pk7HGRoq3Q7MlVLV23xkVM0yyjSP8ClSlvfUy3b_IqvKQW5Lvwj38QzJhee-aH1grerB4pRpMzn_FGueigG_RGI56pKPgFBTr49cpynQy" https://www.googleapis.com/gmail/v1/users/alexey.p.sushkov@gmail.com/profile

Schritt 8: Als Antwort erhalten wir JSON mit nützlichen Informationen:

{
 "emailAddress": "alexey.p.sushkov@gmail.com",
 "messagesTotal": 372543,
...
}

Überprüfen wir nun die Anweisung, dass id_token Informationen zur Authentifizierung des Benutzers und zur Aufrechterhaltung der Sitzung enthält. Dazu müssen Sie den Inhalt entschlüsseln. Der einfachste Weg, dies zu tun, besteht darin, die Google-API unter
oauth2.googleapis.com/tokeninfo zu kontaktieren und das empfangene id_token als Parameter anzugeben:

https://oauth2.googleapis.com/tokeninfo?id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3ZDU1ZmY0ZTEwOTkxZDZiMGVmZDM5MmI5MWEzM2U1NGMwZTIxOGIiLCJ0eXAiOi
………………………_……………………………...
SVQ5GQni3irfOzOXYEiqijp6TjGa_a-3jKcEsU5TbasZmAIejsdVcNy2_4mUTiMNSAHljap1hLD2hAzgOZWuQ

Habe JSON:
{
  "iss": "https://accounts.google.com",
  "email": "alexey.p.sushkov@gmail.com",
  "email_verified": "true",
  "iat": "1583257010",
  "exp": "1583260610",
  "typ": "JWT"
...
}

Wir sehen, dass id_token Informationen über die Anmeldung des Benutzers, den Zeitpunkt des Eingangs und die Lebensdauer des Tokens enthält. Wir können daraus schließen, dass OpenID Connect von Google funktioniert und für relevante Szenarien verwendet werden kann.

Webauthn


Webauthentifizierungs- API (auch als WebAuthn bekannt):

  • Der Standard ermöglicht es Benutzern, sich auf Websites und in Anwendungen mit externen Sicherheitsschlüsseln (z. B. USB-Sticks) oder anhand eines Fingerabdrucks und anschließend anhand anderer biometrischer Daten zu identifizieren: Gesicht, Netzhaut.
  • — / «Public key cryptography». Public key cryptography — , . Private key ( ) , public key ( ) .
  • W3C (World Wide Web Consortium) FIDO, Google, Mozilla, Microsoft, Yubico. W3C HTTP, HTML, XML . WebAuthn. WebAuthn : Chrome, Firefox, Edge, Safari.


Im Vergleich zu OAuth 2.0 werden WebAuthn die folgenden Rollen hinzugefügt:

Authenticator : Ein externer Sicherheitsschlüssel (physischer Datenträger oder Fingerabdruckscanner), der den Benutzer mithilfe verschiedener Technologien wie BlueTooth / NFC / USB authentifiziert. Dient:

  • Generierung von Anmeldeinformationen für öffentliche Schlüssel (öffentliche / private Schlüsselpaare).
  • Authenticator speichert den privaten Schlüssel sicher in seinem Speicher
  • Übergibt den öffentlichen Schlüssel an externe Systeme
  • Signiert Daten mit einem privaten Schlüssel und überträgt das Ergebnis an externe Systeme

Authenticator verwendet das CTAP-Protokoll (Client to Authenticator Protocols), um mit dem Browser zu interagieren.

Vertrauliche Partei : Führt dieselbe Funktion wie der „Autorisierungsserver“ in OAuth 2.0 aus, überprüft jedoch die Identität des Benutzers. Nur in OAuth 2.0 war es der Benutzername / das Passwort und in WenAuthn die Anmeldeinformationen für den öffentlichen Schlüssel.

User Agent : Integriert den Browser und die Netzwerkanwendung, dient denselben Zwecken wie der Client in OAuth 2.0, interagiert einerseits mit dem Benutzer und stellt ihm eine grafische Benutzeroberfläche zur Verfügung und interagiert andererseits mit Systemen, in denen Benutzeranmeldeinformationen gespeichert sind .

Autorisierungsablauf


Bevor Sie den Authentifizierungsprozess starten, müssen Sie wie in OAuth 2.0 vorbereitende Schritte ausführen. Nur in OAuth 2.0 haben wir die Anwendung registriert und in WebAuth 2.0 registrieren wir den Benutzer. Die Webauthentifizierungs-API gibt zwei Aufrufe an:

  • navigator.credentials.create - um Benutzeranmeldeinformationen zu erstellen
  • navigator.credentials.get - überprüft die Benutzeranmeldeinformationen

Um sich zu registrieren, müssen Sie navigator.credentials.create aufrufen.

Infolgedessen speichert der Authenticator des Benutzers den privaten Schlüssel für eine bestimmte Site, und der öffentliche Schlüssel wird in der vertrauenden Partei gespeichert.

Bild

Danach ist der Authentifizierungsprozess wie folgt:

Bild

  1. “WebAuthn”. , , WebAuthn, “ ” “ ”. Relying Party Challenge. Challenge — , Code OAuth 2.0.
  2. Relying Party Challenge. , REST API.
  3. Authenticator- CTAP (Client to Authenticator Protocols). navigator.credentials.get c :

    • Challenge
  4. Authenticator , , .
  5. , Authenticator .
  6. Die Anwendung sendet die signierten Daten an die vertrauende Partei.
  7. Die vertrauende Partei entschlüsselt die Daten mit dem öffentlichen Schlüssel, überprüft die Herausforderung und autorisiert den Benutzer.

Um das Material zu reparieren, führen wir Laborarbeiten durch:

WebAuthn: Lab (Google)


Um WebAuthn zu implementieren, können nur auf http-Anfragen verzichtet werden Sie müssen die Browser-API aufrufen, um mit dem Authenticator zu interagieren. Aber hier freut sich Google, eine Sandbox mit Schritt-für-Schritt-Anleitungen erstellt zu haben: Ihr erstes WebAuthn .

Als Ergebnis der Arbeit erhalten wir eine JS-Client-Server-Anwendung, die die Authentifizierung per Fingerabdruck implementiert. Eine funktionierende Deme befindet sich bei .

Wenn Sie es auf einem Smartphone mit einem Fingerabdrucksensor ausführen, können Sie das Ergebnis der Arbeit sehen. Wie üblich zuerst vorbereiten - Benutzer registrieren:

Bild

Erstellen Sie einen Benutzernamen / ein Passwort und hängen Sie dann den Fingerabdruck an:

Bild

Danach zeigt das Programm an, welcher öffentliche Schlüssel an diesen Fingerabdruck angehängt ist:

Bild

Jetzt können Sie das Authentifizierungsskript starten. Wie üblich glauben wir, dass Schritt 1 abgeschlossen wurde und wir vor Ort sind. Um zu Schritt 2 zu gelangen, klicken Sie auf "Try Reauth". Der Browser führt Schritt 3 aus und interagiert mit dem Authenticator, der Sie in Schritt 4 auffordert, Ihren Finger zu legen:

Bild

Wenn der registrierte Finger angebracht ist, werden die Schritte 5 und 6 erfolgreich ausgeführt, und in Schritt 7 zeigt die Anwendung erneut das Fenster mit dem entsprechenden öffentlichen Schlüssel an:

Bild

Fazit


Daher haben wir die drei gängigsten und vielversprechendsten Protokolle zur Benutzeridentifizierung untersucht: OAuth 2.0, OpenID Connect, WebAuthn. Wir haben den Umfang ihrer Anwendbarkeit verstanden:

  • OAuth 2.0 - wird verwendet, um Benutzer über soziale Netzwerke auf Websites zu registrieren und anzumelden. Und auch um Benutzerdaten aus sozialen Netzwerken zu erhalten.
  • OpenID Connect — . OpenID Connect SSO .
  • WebAuthn — .


  • , , .
  • , , .
  • Es ist sinnvoll, Benutzer bei Cloud-Plattformen wie Facebook oder Google zu authentifizieren Sie beschäftigen die besten Sicherheitsexperten, die alle Nuancen der Sicherheit bieten können.
  • Ich schlage optimistisch für die Zukunft vor, weil WebAuthn-Protokoll - eine echte Chance, die Passwort-Hölle unserer Zeit loszuwerden!

Es ist nur der Anfang!

Anhang: Andere Authentifizierungsprotokolle


Der Vollständigkeit halber werde ich die anderen relevanten Protokolle und Technologien auflisten, die zur Identifizierung von Benutzern verwendet werden:

SAML 2.0 (Security Assertion Markup Language)


Das ausgereifte Protokoll von 2005 enthält jedoch nur eine begrenzte Anzahl von Szenarien zum Erstellen von SSO-Systemen. Verwendet ein XML-basiertes Datenformat. Weitere Details finden Sie im Artikel: „Wer verwendet das SAML 2.0-Authentifizierungsprotokoll?“

API zur Verwaltung von Anmeldeinformationen


Die Entwicklung wird von derselben Organisation wie WebAuthn - W3C durchgeführt. Mit dem Standard für die Verwaltung von Anmeldeinformationen können Sie:

  • Speichern Sie die Identität der Abonnenten, sodass Benutzer auf Websites zugreifen können, ohne Kennwörter eingeben zu müssen. Verwenden Sie jedoch Kennwörter aus dem Geschäft.
  • Wählen Sie die erforderlichen Konten aus, um bestimmte Sites einzugeben.
  • Ermöglicht die Verwendung von Anmeldungen / Kennwörtern, die auf einem Gerät auf anderen Geräten eingegeben wurden.

Ein gängiges Implementierungsbeispiel für die API zur Verwaltung von Anmeldeinformationen ist der Kennwortmanager von Google: passwords.google.com

Initiative für offene Authentifizierung (OATH)


Eid Ressourcen

Eine vollständige Liste der OAuth 2.0-basierten Protokolle



All Articles