Nous essayons d'évaluer Keycloak en tant que solution SSO, et cela a l'air bien à bien des égards, mais la documentation manque cruellement de bases.
Pour une installation KeyCloak donnée sur http://localhost:8080/
pour le domaine test
, quels sont les OAuth2 Authorization Endpoint , OAuth2 Token Endpoint et OpenID Connect UserInfo Endpoint ?
Nous ne souhaitons pas utiliser la propre bibliothèque cliente de Keycloak, nous voulons utiliser les bibliothèques clientes standard OAuth2/OpenID Connect, car les applications client utilisant le serveur keycloak seront écrites dans un large éventail de langages (PHP, Ruby, Node, Java, C # Angulaire). Par conséquent, les exemples qui utilisent le client Keycloak ne nous sont pas utiles.
Pour Keycloak 1.2, les informations ci-dessus peuvent être récupérées via l’URL
http: // keycloakhost: keycloakport/auth/realms/ {realm} /. bien connu/openid-configuration
Par exemple, si le royaume est demo,
http: // keycloakhost: keycloakport/auth/realms/demo/.well-known/openid-configuration
Un exemple de sortie de l'URL ci-dessus,
{"issuer": " http: // localhost: 8080/auth/realms/demo ", "authorisation_endpoint": " http: // localhost: 8080/auth/realms/demo/protocole/openid- connect/auth "," token_endpoint ":" http: // localhost: 8080/auth/realms/demo/protocol/openid-connect/token "," userinfo_endpoint ":" http: // localhost: 8080/auth/realms/demo/protocole/openid-connect/userinfo "," end_session_endpoint ":" http: // localhost: 8080/auth/realms/demo/protocole/openid-connect/logout "," jwks_uri ":" http: // localhost: 8080/auth/realms/demo/protocole/openid-connect/certs "," grant_types_supported ": [" code_autorisation "," refresh_token "," mot de passe "]," response_types_supported ": [" code "]," subject_types_supported ": [" public "]," id_token_signing_alg_values_supported ": [" RS256 "]," response_modes_supported ": [" requête "]]
Informations trouvées sur https://issues.jboss.org/browse/KEYCLOAK-571
Remarque: Vous devrez peut-être ajouter votre client à la liste des URL de redirection valides.
Avec la version 1.9.3.Final, Keycloak dispose d’un certain nombre de points de terminaison OpenID. Ceux-ci peuvent être trouvés à /auth/realms/{realm}/.well-known/openid-configuration
. En supposant que votre domaine s'appelle demo
, ce noeud final générera une réponse JSON similaire à celle-ci.
{
"issuer": "http://localhost:8080/auth/realms/demo",
"authorization_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth",
"token_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/token",
"token_introspection_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/token/introspect",
"userinfo_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo",
"end_session_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/logout",
"jwks_uri": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs",
"grant_types_supported": [
"authorization_code",
"implicit",
"refresh_token",
"password",
"client_credentials"
],
"response_types_supported": [
"code",
"none",
"id_token",
"token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"response_modes_supported": [
"query",
"fragment",
"form_post"
],
"registration_endpoint": "http://localhost:8080/auth/realms/demo/clients-registrations/openid-connect"
}
Pour autant que j'ai trouvé, ces noeuds finaux implémentent la spécification Oauth 2.0 .
Après de nombreuses recherches, nous avons pu extraire plus ou moins l'information (principalement à partir de la librairie cliente JS de Keycloak):
/auth/realms/{realm}/tokens/login
/auth/realms/{realm}/tokens/access/codes
En ce qui concerne OpenID Connect UserInfo, pour le moment (1.1.0.Final), Keycloak n'implémente pas ce point de terminaison. Il n'est donc pas totalement compatible OpenID Connect. Cependant, il existe déjà un correctif qui ajoute que, dès cette écriture, il devrait être inclus dans 1.2.x.
Mais - Ironiquement, Keycloak renvoie un id_token
avec le jeton d'accès. id_token
et access_token
sont tous deux JWT signés , et les clés du jeton sont les clés d'OpenID Connect, c'est-à-dire:
"iss": "{realm}"
"sub": "5bf30443-0cf7-4d31-b204-efd11a432659"
"name": "Amir Abiri"
"email: "..."
Ainsi, bien que Keycloak 1.1.x ne soit pas entièrement conforme à OpenID Connect, il "parle" en langage OpenID Connect.
Dans la version 1.9.0, JSON avec tous les terminaux est à l'adresse/auth/realms/{realm}
version porte clé: 4.6.0
En fait, le lien vers .well-know
se trouve sur le premier onglet des paramètres de votre royaume - mais le lien ne ressemble pas à un lien, mais à la valeur de la zone de texte ... mauvaise conception de l'interface utilisateur . Capture d'écran de l'onglet Général du royaume
FQDN/auth/realms/{nom_domaine} /. Bien connu/openid-configuration
vous verrez tout ici, en plus si le fournisseur d'identité est aussi Keycloak, l'alimentation de cette URL configurera tout ce qui est vrai également avec d'autres fournisseurs d'identité, s'ils le prennent en charge et qu'ils l'ont déjà géré.
Lien suivant Fournit un document JSON décrivant les métadonnées relatives au porte-clés.
/auth/realms/{realm-name}/.well-known/openid-configuration
Informations suivantes signalées avec Keycloak 6.0.1 pour le domaine master
{
"issuer":"http://localhost:8080/auth/realms/master",
"authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
"token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
"token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
"userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
"end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
"jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
"check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
"grant_types_supported":[
"authorization_code",
"implicit",
"refresh_token",
"password",
"client_credentials"
],
"response_types_supported":[
"code",
"none",
"id_token",
"token",
"id_token token",
"code id_token",
"code token",
"code id_token token"
],
"subject_types_supported":[
"public",
"pairwise"
],
"id_token_signing_alg_values_supported":[
"PS384",
"ES384",
"RS384",
"HS256",
"HS512",
"ES256",
"RS256",
"HS384",
"ES512",
"PS256",
"PS512",
"RS512"
],
"userinfo_signing_alg_values_supported":[
"PS384",
"ES384",
"RS384",
"HS256",
"HS512",
"ES256",
"RS256",
"HS384",
"ES512",
"PS256",
"PS512",
"RS512",
"none"
],
"request_object_signing_alg_values_supported":[
"PS384",
"ES384",
"RS384",
"ES256",
"RS256",
"ES512",
"PS256",
"PS512",
"RS512",
"none"
],
"response_modes_supported":[
"query",
"fragment",
"form_post"
],
"registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
"token_endpoint_auth_methods_supported":[
"private_key_jwt",
"client_secret_basic",
"client_secret_post",
"client_secret_jwt"
],
"token_endpoint_auth_signing_alg_values_supported":[
"RS256"
],
"claims_supported":[
"aud",
"sub",
"iss",
"auth_time",
"name",
"given_name",
"family_name",
"preferred_username",
"email"
],
"claim_types_supported":[
"normal"
],
"claims_parameter_supported":false,
"scopes_supported":[
"openid",
"address",
"email",
"microprofile-jwt",
"offline_access",
"phone",
"profile",
"roles",
"web-origins"
],
"request_parameter_supported":true,
"request_uri_parameter_supported":true,
"code_challenge_methods_supported":[
"plain",
"S256"
],
"tls_client_certificate_bound_access_tokens":true,
"introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}