2017-08-28 1 views
4

J'évalue certains produits IAM et j'ai rencontré un problème avec CORS avec le RealmResourceProvider de Keycloak. Le but est d'écrire un client angular4 capable de créer des utilisateurs et de gérer des groupes avec une interface REST de Keycloak.keycloak realmresourceprovider corse

côté serveur:

j'ai essayé d'implémenter l'interface de repos avec l'interface RealmResourceProvider afin d'accéder aux données de l'utilisateur et de domaines aussi facile que possible. J'ai suivi l'exemple de Beercloak (github.com/dteleguin/beercloak) et l'ai fait fonctionner, mais sans un thème personnalisé (seulement les ressources REST). Ma propre application est emballée en tant que Jar. J'ai réussi à appeler cette façade via le client REST et cela a fonctionné (en appelant d'abord localhost: 8080/auth/realms/master/protocole/openid-connect/jeton, puis en plaçant le jeton dans l'en-tête d'autorisation).

keycloak configuration Mais si je le tester via un navigateur, je devrai permettre Cross-Origin-partage Ressource. Pour ce faire, j'ajouté l'attribut 'enable-CORS de la « keycloak.json » dans l'application serveur:

{ 
"realm": "master", 
"auth-server-url": "http://localhost:8080/auth", 
"ssl-required": "external", 
"resource": "pharmacyRessource", 
"public-client": true, 
"enable-cors": true 
} 

De plus, je créé un client dans le Keycloak Administrateur. Client Config

côté client et Problème:

Le client utilise le service angulaire Mohuks NG2-keycloak de github.com/mohuk/ng2-keycloak/blob/master/src/keycloak.service.ts à obtenir le accesstoken. - Fonctionne bien. Mais au cas où je fais une demande GET à ma ressource, le contrôle en amont échoue en raison de l'en-tête Access-Control-Allow-Origin manquant: Error 401 Le keycloak.json utilisé pour initialiser le keycloak-client dans javascript ressemble à ceci:

{ 
    "realm": "master", 
    "auth-server-url": "http://localhost:8080/auth", 
    "ssl-required": "external", 
    "resource": "pharmacyRessource", 
    "public-client": true 
} 

Mes solutions forfait:

  • J'ai essayé de mettre en œuvre un filtre CORS, mais je ne réussissais pas parce que je ne pouvais pas l'obtenir enregistré par keycloak.
  • J'ai également implémenté la méthode @OPTIONS et les en-têtes CORSE en annexe par moi-même. N'a pas fonctionné non plus, parce que la méthode n'a jamais été invoquée.
  • J'ai essayé de l'empaqueter en tant que .war afin d'activer un filtre/fournisseur personnalisé, mais j'ai échoué lors de l'enregistrement des ressources sur keycloak.

Mon environnement de test est le conteneur docker de offical hub.docker.com/r/jboss/keycloak/

+0

J'ai réussi à obtenir la méthode OPTIONS appelée. Mais je dois ajouter l'en-tête Corse à toutes les méthodes par moi-même. Je vais maintenant attacher les en-têtes moi-même en fonction des WebOrigins du ClientModel demandé. –

Répondre

1

Avez-vous besoin activer CORS dans votre serveur keycloak (qui fonctionne dans wildlfy). Vous pouvez le faire, en mettant le code ci-dessous dans votre fichier standalone.xml de wildfly:

 <subsystem xmlns="urn:jboss:domain:undertow:4.0"> 
     <buffer-cache name="default"/> 
     <server name="default-server"> 
      <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/> 
      <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/> 
      <host name="default-host" alias="localhost"> 
       <location name="/" handler="welcome-content"/> 
       <filter-ref name="server-header"/> 
     <filter-ref name="x-powered-by-header"/> 
     <filter-ref name="Access-Control-Allow-Origin"/> 
     <filter-ref name="Access-Control-Allow-Methods"/> 
     <filter-ref name="Access-Control-Allow-Headers"/> 
     <filter-ref name="Access-Control-Allow-Credentials"/> 
     <filter-ref name="Access-Control-Max-Age"/> 
       <http-invoker security-realm="ApplicationRealm"/> 
      </host> 
     </server> 
     <servlet-container name="default"> 
      <jsp-config/> 
      <websockets/> 
     </servlet-container> 
     <handlers> 
      <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> 
     </handlers> 
      <filters> 
     <response-header name="server-header" header-name="Server" header-value="WildFly/10"/> 
     <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/> 
     <response-header name="Access-Control-Allow-Origin" header-name="Access-Control-Allow-Origin" header-value="http://localhost"/> 
     <response-header name="Access-Control-Allow-Methods" header-name="Access-Control-Allow-Methods" header-value="GET, POST, OPTIONS, PUT"/> 
     <response-header name="Access-Control-Allow-Headers" header-name="Access-Control-Allow-Headers" header-value="accept, authorization, content-type, x-requested-with"/> 
     <response-header name="Access-Control-Allow-Credentials" header-name="Access-Control-Allow-Credentials" header-value="true"/> 
     <response-header name="Access-Control-Max-Age" header-name="Access-Control-Max-Age" header-value="1"/> 
     </filters> 
    </subsystem>