alternatives - ¿Cuáles son los puntos finales OAuth2/OpenID Connect de Keycloak?
keycloak js (8)
Con la versión 1.9.3.Final, Keycloak tiene varios puntos finales OpenID disponibles.
Estos se pueden encontrar en
/auth/realms/{realm}/.well-known/openid-configuration
.
Suponiendo que su reino se llame
demo
, ese punto final producirá una respuesta JSON similar a esta.
{
"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"
}
Por lo que he encontrado, estos puntos finales implementan la especificación Oauth 2.0 .
Estamos tratando de evaluar Keycloak como una solución de SSO, y se ve bien en muchos aspectos, pero la documentación es penosamente escasa en lo básico.
Para una instalación de Keycloak dada en
http://localhost:8080/
for realm
test
, ¿cuáles son el
punto final de autorización
OAuth2
, el
punto final del token OAuth2
y el
punto final OpenIn Connect UserInfo
?
No estamos interesados en usar la propia biblioteca de cliente de Keycloak, queremos usar las bibliotecas de cliente estándar de OAuth2 / OpenID Connect, ya que las aplicaciones de cliente que usan el servidor de keycloak se escribirán en una amplia gama de lenguajes (PHP, Ruby, Node, Java, C # , Angular). Por lo tanto, los ejemplos que usan el cliente Keycloak no nos sirven.
Después de mucho investigar, pudimos raspar la información más o menos (principalmente de la propia biblioteca JS de Keycloak):
-
Punto final de autorización:
/auth/realms/{realm}/tokens/login
-
Punto final del token:
/auth/realms/{realm}/tokens/access/codes
En cuanto a OpenID Connect UserInfo , en este momento (1.1.0.Final) Keycloak no implementa este punto final, por lo que no es totalmente compatible con OpenID Connect. Sin embargo, ya hay un patch que agrega que a partir de este escrito debería incluirse en 1.2.x.
Pero
, irónicamente, Keycloak envía un
id_token
junto con el token de acceso.
Tanto
id_token
como
access_token
son
access_token
firmados
, y las claves del token son las claves de OpenID Connect, es decir:
"iss": "{realm}"
"sub": "5bf30443-0cf7-4d31-b204-efd11a432659"
"name": "Amir Abiri"
"email: "..."
Entonces, aunque Keycloak 1.1.x no es totalmente compatible con OpenID Connect, "habla" en el lenguaje OpenID Connect.
En la versión 1.9.0, json con todos los puntos finales está en address / auth / realms / {realm}
- Punto final de autorización: / auth / realms / {realm} / account
- Punto final del token: / auth / realms / {realm} / protocol / openid-connect
En realidad, el enlace a
.well-know
está en la primera pestaña de la configuración de su reino, pero el enlace no se ve como un enlace, sino como el valor del cuadro de texto ... mal diseño de interfaz de usuario.
Captura de pantalla de la pestaña General del reino
Enlace siguiente Proporciona un documento JSON que describe metadatos sobre Keycloak
/auth/realms/{realm-name}/.well-known/openid-configuration
Información siguiente informada con Keycloak 6.0.1 para el dominio
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"
}
FQDN / auth / realms / {realm_name} /. Bien conocido / openid-configuration
verá todo aquí, además, si el proveedor de identidad también es Keycloak, al alimentar esta URL se configurará todo también con otros proveedores de identidad si lo admiten y ya lo manejaron
Para Keycloak 1.2, la información anterior se puede recuperar a través de la URL
http://keycloakhost:keycloakport/auth/realms/ {realm} /. configuración conocida / openid
Por ejemplo, si el nombre del reino es demo :
http://keycloakhost:keycloakport/auth/realms/demo/.well-known/openid-configuration
Un ejemplo de salida de la URL anterior:
{
"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",
"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",
"refresh_token",
"password"
],
"response_types_supported": [
"code"
],
"subject_types_supported": [
"public"
],
"id_token_signing_alg_values_supported": [
"RS256"
],
"response_modes_supported": [
"query"
]
}
Información encontrada en https://issues.jboss.org/browse/KEYCLOAK-571
Nota: es posible que deba agregar su cliente a la lista de URI de redireccionamiento válido
versión de keycloak: 4.6.0
- TokenUrl: [dominio] / auth / realms / {REALM_NAME} / protocol / openid-connect / token
- AuthUrl: [dominio] / auth / realms / {REALM_NAME} / protocol / openid-connect / auth