[JAVA] Verfahren zum Erstellen eines Autorisierungsservers mit Authlete (CIBA-kompatible Version)

Was ist OAuth / OpenID Connect CIBA (Client Initiated Backchannel Authentication)?

Ich ging zu "OAuth & OIDC Study Group (FAPI & CIBA Special!)", die am 28. März (Donnerstag) stattfand.

Der Organisator ist Authlete, ein Unternehmen, das Baas bereitstellt, mit dem OAuth- und OpenID Connect-Autorisierungsserver (OIDC) erstellt werden können. Der Authlete-Clouddienst war mit CIBA kompatibel, einer neuen Spezifikation von OAuth / OIDC. Es handelte sich also um eine Studiensitzung, die auch als Einführung in den Clouddienst diente.

Abgesehen von meiner OAuth war CIBA mein erster Blick, also habe ich viel gelernt. Vielen Dank an die Leute von Authlete, die die Lernsitzung veranstaltet haben.

Diesmal ging es um FAPI (Financial Grade API) und CIBA (Client Initiated Backchannel Authentication), aber in Bezug auf FAPI wird "Einschränkungen bei der Verwendung von OAuth / OIDC an Orten mit höheren Sicherheitsanforderungen wie der Finanzbranche" angegeben. Sie können es sich als konvertiertes Produkt vorstellen. Ein leicht verständliches Beispiel ist, dass die OAuth Client-Clientauthentifizierung beim Aufnehmen von Token keine Basisauthentifizierung ist. Bereiten Sie daher ein X.509-Zertifikat usw. vor. ..

CIBA steht für OpenID Connect Client Initiated Backchannel Authentication Flow - Core 1.0. OAuth / OIDC (sogenannter RFC 6749) war ** eine Prämissenverarbeitungssequenz unter Verwendung der WEB-Browserumleitung **, während [^ 1] CIBA hat eine Verarbeitungssequenz von ** Senden einer Authentifizierungsanforderung an den Endpunkt der Rückkanalauthentifizierung ** und ** Benachrichtigen des Authentifizierungsgeräts des vorregistrierten Benutzers "Zustimmen?" **. Ist eine Funktion. ..

[^ 1]: Es ist beeindruckend, dass die Person, die auf der Bühne war, diese Verarbeitungssequenz als ** OAuth Dance ** erklärte :-)

Dies ermöglicht zum Beispiel

Was für eine Verarbeitungssequenz, die keine Browserumleitung erfordert, kann realisiert werden. Nun, es ist wirklich praktisch.

Die spezifische Verarbeitungssequenz sieht so aus. ..

image.png

Intro

Nun, vorher hatte ich die Gelegenheit, den Authlete-Service in einem bestimmten Entwicklungsprojekt zu berühren, und ich habe den Bauvorgang zu dieser Zeit in Qiita veröffentlicht, obwohl es um Hello World geht.

Dieses Mal hatte ich das Glück, die Gelegenheit zu haben, den CIBA-kompatiblen Authlete-Dienst zu berühren, sodass ich den Bauvorgang zur Erinnerung aufzeichnen werde. (Vielen Dank!)

Vorausgesetztes Wissen

Es ist eine Grundvoraussetzung für das Lesen des folgenden Konstruktionsverfahrens, aber ich gehe davon aus, dass ich zu einem gewissen Grad über OAuth / OIDC und CIBA verfüge. Beispielsweise kennen Sie im Allgemeinen die Verarbeitungssequenz von Authorization Code Grant Flow oder CIBA Flow.

Das Folgende ist die sogenannte OAuth Dance-Verarbeitungssequenz des Authorization Code Grant Flow. Die Position von Authlete wird auch zusammen geschrieben.

--Authorization Code Grant Flow-Verarbeitungssequenz

image.png

Dieses Mal werde ich durch Berühren des CIBA-kompatiblen Authlete versuchen, die folgende ** CIBA Flow-Verarbeitungssequenz zu implementieren und das Zugriffstoken ** zu erhalten. Für Authentifizierungsgeräte gibt es eine Simulator-Site für Authentifizierungsgeräte. Verwenden Sie diese Site.

--CIBA Flow-Verarbeitungssequenz

image.png

Voraussetzung Umgebung

Die Umgebung um diese Zeit ist wie folgt.

$ sw_vers
ProductName:    Mac OS X
ProductVersion:    10.14.4
BuildVersion:    18E226
$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
$ mvn --version
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T03:41:47+09:00)
$
$ curl --version
curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.5 zlib/1.2.11 nghttp2/1.24.1
$
$ jq --version
jq-1.6
$

Ich mache es oben, aber wenn Maven, Curl, JQ (und Git) funktionieren, denke ich, dass alles, einschließlich des Betriebssystems, in Ordnung ist.

Vorbereitung

Obwohl es sich um ein Zeichen wie verschiedene Server handelt, wurde in vorheriger Artikel

Verwenden Servername URL
Autorisierungsserver. Ein Server, der Autorisierungsinformationen für jede Benutzer-ID verwaltet. java-oauth-server http://oauth.example.com:8080/
Ressourcenserver. Ein Server mit Daten und Funktionen für jede Benutzer-ID. java-resource-server http://resource.example.com:8081/
Internetanwendung. Webanwendungen, die Ressourcen vom Ressourcenserver verwenden java-oauth-client http://client.example.com:8082/

Da es in diesem Artikel jedoch darum geht, das Zugriffstoken (oder id_token) abzurufen, wird der Ressourcenserver weggelassen und der Befehl curl wird als OAuth-Client verwendet. Daher hat es eine einfache Struktur wie unten gezeigt.

Verwenden Servername URL
Autorisierungsserver. Ein Server, der Autorisierungsinformationen für jede Benutzer-ID verwaltet. java-oauth-server http://localhost:8080/
Ressourcenserver. Ein Server mit Daten und Funktionen für jede Benutzer-ID. Kürzung -
OAuth-Client. Eine App, die Ressourcen vom Ressourcenserver verwendet. Diesmal locken -

Rauer Fluss

Der allgemeine Ablauf entspricht im Wesentlichen der herkömmlichen Verwendung von Authlete.

  1. Melden Sie sich bei Authlete an
  2. Autorisierungsserverregistrierung / Clientregistrierung
  3. Aufbau eines Autorisierungsservers, Aufbau eines Ressourcenservers (weggelassen)
  4. Kommunikation von der Webanwendung (bis das Zugriffstoken verwendet wird)

Wie jedoch im Artikel [Erstellen eines CIBA-kompatiblen Autorisierungsservers mit Authlete] beschrieben (https://qiita.com/hidebike712/items/8fc2938055d0b49cfc0a#14-Others) (Human in) Es scheint, dass Sie Authlete kontaktieren müssen, um sich für Ihr Konto anzumelden.

Daher wurde in diesem Artikel das Konto angemeldet und die folgenden Informationen wurden von der CIBA-kompatiblen Authlete-Site abgerufen (normalerweise https://so.authlete.com/, aber die CIBA-kompatible Version hat eine andere URL). Ich werde davon ausgehen, dass.

--API-Schlüssel / API-Geheimnis des diesem Konto zugeordneten Autorisierungsservers

API-Schlüssel API-Geheimnis
116xxxxxxxx sZUkxxxxxxxxxxxxxxxxxxx

--OAuth Client Client ID / Client Secret auf dem Autorisierungsserver registriert

Kunden ID Kundengeheimnis
249xxxxxxx WUItxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Übrigens können Sie den API-Schlüssel / das API-Geheimnis des Autorisierungsservers anhand der folgenden Serviceliste >> Servicedetails überprüfen. image.png

Sie können auch die Client-ID / das Client-Geheimnis des auf dem Autorisierungsserver registrierten OAuth-Clients in der App-Liste >> App-Details in der Client App Developer Console überprüfen. image.png

Umgebungseinstellung

Im Folgenden finden Sie einige Einstellungen zum Aktivieren von CIBA auf der Authlete-Website.

Einstellungen auf der Seite des Autorisierungsservers

Die Site (Dienstadministratorkonsole), die zuvor den API-Schlüssel / das API-Geheimnis auf der Seite des Autorisierungsservers bestätigt hat Gehen Sie zur Registerkarte "Serviceliste >> Servicedetails >> CIBA" und gehen Sie zu

Artikel Wert
Unterstützte Token-Übermittlungsmodi POLL,PING,PUSH
Benutzercode-Unterstützung zu unterstützen

Wählen.

image.png

Einstellungen auf der OAuth-Client-Seite

Übergang zu "App-Liste >> App-Details" auf der Site (Client-App-Entwicklerkonsole), auf der die Client-ID / das Client-Geheimnis des OAuth-Clients bestätigt wird.

Auf der Registerkarte "Grundlegende Informationen"

Artikel Wert
Client-Typ CONFIDENTIAL

Wählen.

image.png

Auf der Registerkarte "Autorisierung"

Artikel Wert
Client-Authentifizierungsmethode CLIENT_SECRET_BASIC

Wählen.

image.png

Auf der Registerkarte "CIBA"

Artikel Wert
Token Delivery-Modus POLL
Benutzercode-Anfrage Anfrage

Wählen.

image.png

Damit sind die Umgebungseinstellungen für den Autorisierungsserver und den OAuth-Client im POLL-Modus abgeschlossen.

Versuche dich zu bewegen

Erstellen Sie einen Autorisierungsserver

Erstellen Sie zunächst einen Autorisierungsserver. Klonen Sie das GitHub-Repository und legen Sie den API-Schlüssel, das API-Geheimnis und base_url in der Konfigurationsdatei (authlete.properties) fest.

$ git clone https://github.com/authlete/java-oauth-server.git
$ cd java-oauth-server
$ cat authlete.properties
service.api_key =116xxxxxxxx ← Bitte wechseln Sie zum richtigen API-Schlüssel
service.api_secret =sZUkxxxxxxxxxxxxxxxxxxxx ← Bitte wechseln Sie zum richtigen API-Geheimnis
base_url = https://api.authlete.com ← Bitte wechseln Sie zu einer CIBA-kompatiblen URL(Wenden Sie sich für den Wert an Authlete)

Anlaufen.

$ mvn clean jetty:run  -Dauthlete.ad.workspace=masatomix/testProject ← Argument ist ein Wert, der im Simulator festgelegt wird und später angezeigt wird

Damit ist der Aufbau des Autorisierungsservers abgeschlossen.

Vorbereitung des Authentifizierungsgeräts

Der Autorisierungsserver, der die Backchannel-Authentifizierungsanforderung empfängt, sendet eine Benachrichtigung an das Authentifizierungsgerät "Kann ich dies zulassen?". Der Code des geklonten Autorisierungsservers lautet jedoch standardmäßig [Authlete CIBA Simulator](https: //). Benachrichtigungen werden jetzt an cibasim.authlete.com/) gesendet. Also werden wir den Simulator einrichten.

Gehen Sie zu https://cibasim.authlete.com/ und setzen Sie das obige Argument.

Namespace Project
masatomix testProject

Geben Sie an und klicken Sie auf "Erstellen". (Der Screenshot unten ist nach dem Erstellen "Öffnen".)

image.png

Anschließend wechselt der Bildschirm zum AD-Simulatorbildschirm (Authentication Device). Der von Authlete bereitgestellte Autorisierungsserver ist mit einer Dummy-Benutzerauthentifizierung codiert.

User ID User Code
1001 675325

Sie können sich unter anmelden. Geben Sie daher die Benutzer-ID "1001" an, wie im Capture gezeigt, und klicken Sie auf "AD-Simulator starten".

image.png

Der Simulator wartet. Da die OAuth-Authentifizierung / -Autorisierung auf diesem Bildschirm durchgeführt wird, lassen Sie den Bildschirm offen (anscheinend wird hier mit WebSocket eine Push-Benachrichtigung angezeigt, wenn der Autorisierungsserver eine Rückkanal-Authentifizierungsanforderung erhält).

image.png

Wenn Sie diesen Bildschirm mit einem Smartphone öffnen, spüren Sie übrigens ein Gefühl für die Realität. Wenn Sie eine Authentifizierungsanforderung von curl auf einem PC senden, der nichts damit zu tun hat, wird anscheinend eine Benachrichtigung an Ihr Smartphone gesendet. image.png

Kanalauthentifizierungsanforderung zurücksenden

Senden wir nun eine Authentifizierungsanforderung an den Autorisierungsserver.

$ clientId=249xxxxxxx ← Client-ID
$ clientSecret=WUItxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← Client-Geheimnis
$ curl http://localhost:8080/api/backchannel/authentication -X POST \
--user ${clientId}:${clientSecret} \
-d 'login_hint=1001' \
-d 'user_code=675325' \
-d 'scope=openid' 
{
  "auth_req_id": "Xe250q9AoSdUL_xohrPm8txYNUo8VlddhLv1ENUY6SM",
  "interval": 5,
  "expires_in": 600
}
$

Ich habe auth_req_id (Authentifizierungsanforderungs-ID) erhalten. Notieren Sie sich dies, da Sie es später verwenden werden.

Authentifizierungsprozess auf dem Authentifizierungsgerät

Wenn Sie die Authentifizierungsanforderung senden, sollte im Simulator der mit OAuth vertraute Autorisierungsbildschirm angezeigt werden. Wählen Sie diesmal "Zulassen". image.png

Token-Anfrage senden

Nachdem Sie die Berechtigung des Benutzers haben, können Sie die soeben gesehene auth_req_id verwenden. Nachdem Sie das Token erhalten möchten, senden Sie eine Tokenanforderung.

$ clientId=249xxxxxxx ← Client-ID
$ clientSecret=WUItxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← Client-Geheimnis
$ curl http://localhost:8080/api/token -X POST \
--user ${clientId}:${clientSecret} \
-H 'Content-type: application/x-www-form-urlencoded' \
-d 'auth_req_id=Xe250q9AoSdUL_xohrPm8txYNUo8VlddhLv1ENUY6SM' \
-d 'grant_type=urn:openid:params:grant-type:ciba'

{
"access_token":"ldofpBo8hO67CNr4sE_Cibt1FYZ8RpQCIPVlUaeokks",
"refresh_token":"U0JyhKdXh-h3h6hDLiu3eart9RpEwnSClMtgGjAFu5o",
"scope":"openid",
"id_token":
"eyJhbGciOiJIUzI1NiJ9.eyJhdF9oYXNoIjoiRkxwdFBEaWlMbUcwdkVLWFZndjBUZyIsInN1YiI6IjEwMDEiLCJhdWQiOiIyNDkzOTMxNjU5OTciLCJhdXRoX3RpbWUiOjE1NTM4NTE3MjQsImlzcyI6Imh0dHBzOi8vYXV0aGxldGUuY29tIiwiZXhwIjoxNTUzOTM4MTM0LCJpYXQiOjE1NTM4NTE3MzR9.7G_VfqlSlDd0cOSjZaRorSrbcH3PoKneM_YalCpFHig","token_type":"Bearer","expires_in":86400
}

Du hast einen Zugangstoken! Da der Bereich dieses Mal auf openid gesetzt ist, wird auch id_token erhalten.

$ echo eyJhdF9oYXNoIjoiRkxwdFBEaWlMbUcwdkVLWFZndjBUZyIsInN1YiI6IjEwMDEiLCJhdWQiOiIyNDkzOTMxNjU5OTciLCJhdXRoX3RpbWUiOjE1NTM4NTE3MjQsImlzcyI6Imh0dHBzOi8vYXV0aGxldGUuY29tIiwiZXhwIjoxNTUzOTM4MTM0LCJpYXQiOjE1NTM4NTE3MzR9 | base64 -D | jq
{
  "at_hash": "FLptPDiiLmG0vEKXVgv0Tg",
  "sub": "1001",
  "aud": "249393165997",
  "auth_time": 1553851724,
  "iss": "https://authlete.com",
  "exp": 1553938134,
  "iat": 1553851734
}

Eigentlich Umfrage

Da dieser Vorgang in der Abfrage im Push-, Ping- und Abfragemodus ausgeführt wird, werden Sie nicht benachrichtigt, wenn die Authentifizierungsanforderung in Ordnung ist. In Wirklichkeit scheint es, dass die App nach dem Senden der Authentifizierungsanforderung eine Abfrage durchführen muss.

Versuchen Sie beispielsweise, die folgende Shell auszuführen.

$ cat ciba_request.sh
#!/bin/bash

clientId=249xxxxxxx ← Client-ID
clientSecret=WUItxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← Client-Geheimnis

login_hint=1001
user_code=675325

backchannelReq=`cat << EOS
curl http://localhost:8080/api/backchannel/authentication -X POST \
--user ${clientId}:${clientSecret} \
-d 'login_hint=${login_hint}' \
-d 'user_code=${user_code}'  \
-d 'scope=openid' -s | jq .auth_req_id -r
EOS
`

auth_req_id=`eval "${backchannelReq}"`
echo ${auth_req_id}

for i in {0..3}; do
    sleep 3
    tokenReq=`cat << EOS
curl http://localhost:8080/api/token -X POST \
--user ${clientId}:${clientSecret}  \
-H 'Content-type: application/x-www-form-urlencoded' \
-d 'auth_req_id=${auth_req_id}' \
-d 'grant_type=urn:openid:params:grant-type:ciba' -s
EOS
`
    token=`eval "${tokenReq}"`
    error=`echo ${token} | jq 'select(.error_description==null)'`
    
    echo ${token} | jq
    if [ -n "$error" ]; then
        break;
    fi
done
$ ./ciba_request.sh
lrHy0QdUalqpL7K2MRMfV_uhCLuvolCk5hS70LEb7R8
{
  "error_description": "[A200308] The end-user has not been authenticated yet.",
  "error": "authorization_pending",
  "error_uri": "https://www.authlete.com/documents/apis/result_codes#A200308"
}
{
  "error_description": "[A200308] The end-user has not been authenticated yet.",
  "error": "authorization_pending",
  "error_uri": "https://www.authlete.com/documents/apis/result_codes#A200308"
}

//Wenn Sie hier im Simulator auf Zulassen klicken. ..
{
  "access_token": "RexqI1mrrCpVI9fiYJWhxuJMSSOfD6j1ijNXs-cXOts",
  "refresh_token": "x0CuGD-CPK1q2b8WzuU5WYBeCoIxdkBg5aaenLCeeWQ",
  "scope": "openid",
  "id_token": "eyJhbGciOiJIUzI1NiJ9.eyJhdF9oYXNoIjoidVBRWVVnT1BmenVaQ1Jab0E1b21XUSIsInN1YiI6IjEwMDEiLCJhdWQiOiIyNDkzOTMxNjU5OTciLCJhdXRoX3RpbWUiOjE1NTQyNTc4NzksImlzcyI6Imh0dHBzOi8vYXV0aGxldGUuY29tIiwiZXhwIjoxNTU0MzQ0MjgxLCJpYXQiOjE1NTQyNTc4ODF9.1mdVZ2hub3GzwGNNxaL1HxlQHdIioSvLyp0UJfdMDog",
  "token_type": "Bearer",
  "expires_in": 86400
}
$

Hört sich gut an. ..

Zusammenfassung

Dieses Mal habe ich versucht, mithilfe des Authlete-Dienstes einen CIBA-kompatiblen Autorisierungsserver (Abfragemodus) zu erstellen. Obwohl es weit davon entfernt ist, das gesamte Gefühl nur durch das Erstellen der Berührung zu verstehen, konnte ich den Autorisierungsserver mithilfe von Authlete einfach einrichten.

Danke für Ihre Unterstützung.

ähnliche Links

Recommended Posts

Verfahren zum Erstellen eines Autorisierungsservers mit Authlete (CIBA-kompatible Version)
Verfahren zum Veröffentlichen einer Anwendung mit AWS (5) Veröffentlichen einer Anwendung
Verfahren zum Veröffentlichen einer Anwendung mit AWS (6) Führen Sie Nginx ein
Verfahren zum Veröffentlichen einer Anwendung mit AWS (4) Erstellen einer Datenbank
Verfahren zum Veröffentlichen einer Anwendung mit AWS (7) Automatische Bereitstellung durch Capistrano
So erstellen Sie mit rbenv eine Umgebung für eine beliebige Version von Ruby