2017-11-14 3 views
2

Ich versuche, eine REST-API mit Schlüsselcloak-Autorisierungsmechanismen zu sichern. Meine API ist in NodeJS mit ausdrücklichen.
Sagen, ich habe diese API:Keycloak: authZ mit nodeJS

http://www.example.com/api/v1/houses 

Der Endpunkt unterstützt GET/POST/PUT/DELETE. Ein Haus hat einen Namen und einen Besitzer:

{ 
    name: 'myhouse', 
    owner: 'smith' 
} 

Jeder Häuser sehen können. Sie können auch Häuser erstellen und automatisch zum Eigentümer werden. Nur der Besitzer kann ein Haus löschen. Es ist ähnlich wie die photoz example.

Mit Keycloak Connect in Inhaber-only-Modus arbeitet mit NodeJS ausdrücken:

router.get('/houses*', keycloakProtect(), myHandler) 

Aber dies stellt nur Authentifizierung, Autorisierung nicht. Im Grunde überprüft es nur, dass Sie das richtige Token bereitgestellt haben. KeycloakProtect bietet einen rudimentären Autorisierungsmechanismus, der nur auf Rollennamen basiert. Allerdings möchte ich die volle Macht der Client-Berechtigungen (mit Ressourcen, Bereichen und Richtlinien) verwenden ... Gibt es dafür NodeJS-Unterstützung? Wenn nein, wie wird die Keycloak-API dafür verwendet?

Antwort

0

fand ich einen Anfang Antwort mithilfe des API:

TOKEN=`curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=username&password=password&grant_type=password&client_id=myclient&client_secret=myclientsecret' "http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token" | jq .access_token -r` 

curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{ 
    "permissions" : [ 
     { 
      "resource_set_name" : "Houses", 
      "scopes" : [ 
       "view" 
      ] 
     } 
    ] 
}' "http://localhost:8080/auth/realms/myrealm/authz/entitlement/myclient" 

Der zweite Anruf mit 200 antworten, wenn autorisiert und nicht 403, wenn.

Um Autorisierungsrichtlinien in Keycloak zu definieren, aktivieren Sie in Ihrem Client "Autorisierungen".Auf der neuen "Berechtigung" Register:

  • Einstellungen
    • Enable "Remote-Ressource Management"
  • Ressourcen Erstellen eines:
    • Name: Häuser
    • Bereiche: erstellen, anzeigen , Zu aktualisieren, löschen
    • uri:/Häuser/*
  • Scopes erstellen 4 Bereiche: erstellen, anzeigen, aktualisieren, löschen
  • Richtlinien eine Rolle erstellen basierte Politik mit:
    • Name: public_role_policy
    • Beschreibung: Benutzer muss die Rolle "public" haben, um erlaubt zu sein
    • Realm-Rollen: public
  • Berechtigungen Erstellen eines mit:
    • Name: "öffentliche Rolle erlaubt Häuser, um"
    • Ressource: Häuser
    • Bereiche: view
    • Politik: public_role_policy

Sie müssen auch eine Bereichsrolle "public" erstellen und an Ihre Benutzer weitergeben.

Als nächstes müssen Sie Ressourcen remote erstellen. Zuerst ein Client-Token erhalten:

TOKEN=`curl -X POST \ 
-H "Content-Type: application/x-www-form-urlencoded" \ 
-d 'grant_type=client_credentials&client_id=myclient&client_secret=myclientsecret' 
"http://localhost:8080/auth/realms/${realm_name}/protocol/openid-connect/token" | jq .access_token -r` 

Dann Ressourcen erstellen:

curl -X POST "http://localhost:8080/auth/realms/myrealm/authz/protection/resource_set" -H "Authorization: Bearer $TOKEN" -d '{ 
    "name": "My house", 
    "uri": "/houses/123", 
    "scopes": [ 
     { 
     "id": "da776461-c1f5-4904-a559-1ca04d9f53a9", 
     "name": "view" 
     }, 
     { 
     "id": "2615157c-f588-4e2b-ba1c-720fe8394215", 
     "name": "manage" 
     } 
    ], 
    "owner": "0892e431-5daf-413e-b4cf-eaee121ee447" 
}' 
0

ich ein bisschen weiter mit der ähnlichen Aufgabe bewegt. Aber ich erschaffe keine Ressourcen. Vielleicht ist deine Herangehensweise besser. Ich weiß es nicht.

Um den Besitzer des Hauses zu überprüfen, werde ich eine Datenbankprüfung verwenden - einfach eine Benutzeranmeldung von einem Keycloak-Token erhalten und überprüfen, ob ein bestimmtes Haus im Besitz des Benutzers in der Anwendungsdatenbank ist.

v-ladynev/keycloak-nodejs-example