¿Cuáles son los extremos OAuth2 / OpenID Connect de Keycloak?

99

Estamos tratando de evaluar Keycloak como una solución SSO, y se ve bien en muchos aspectos, pero la documentación carece de lo básico.

Para una determinada instalación de Keycloak en el http://localhost:8080/dominio test, ¿cuáles son el punto final de autorización OAuth2 , el punto final del token OAuth2 y el punto final UserInfo de OpenID Connect ?

No estamos interesados ​​en usar la propia biblioteca cliente de Keycloak, queremos usar bibliotecas cliente estándar OAuth2 / OpenID Connect, ya que las aplicaciones cliente que usan el servidor keycloak estarán escritas 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.

Amir Abiri
fuente
1
¿Qué terminaste usando en su lugar?
Ced
1
Finalmente pudimos convencer arriba de que OAuth no tiene nada que ver con el inicio de sesión y la seguridad como tecnología para usar en la aplicación en sí, y solo es relevante para la integración con terceros. Fue difícil explicar el hecho de que Google y FB lo usen en todas partes no tiene relevancia para nosotros.
Amir Abiri
6
@AmirAbiri no diría que se usa solo para la integración de terceros. Ese es su uso principal hoy en día, pero, al ser un protocolo que más y más empresas de Internet admiten, también podría tener sentido si está tratando con múltiples aplicaciones (o microservicios) en su propio entorno empresarial y desea una solución SSO. De hecho, en mi caso, habiendo usado keycloak durante más de 10 meses, creo que también podría merecerlo para aplicaciones simples, ya que se encarga de todas las cosas de administración de usuarios.
Xtreme Biker

Respuestas:

131

Para Keycloak 1.2, la información anterior se puede recuperar a través de la URL

http: // keycloakhost: keycloakport / auth / realms / {realm} /. well-known / openid-configuration

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

No puedo decir
fuente
1
Desde entonces hemos descartado el uso de Keycloak, así que no puedo verificarlo.
Amir Abiri
¿Qué URL se usaría para tener un enlace de inicio de sesión en una aplicación web? Intentaste todos esos pero no hacen eso
Ced
2
@AmirAbiri ¿cuál es su alternativa a KeyCloak? Actualmente lo estoy evaluando. Le gusta la interfaz de usuario y me gustaría que todos mis usuarios fueran administrados por ella, pero me cuesta mucho adjuntar mi aplicación GoLang.
Tarion
@Tarion Hay un servidor de identidad WSO2, por ejemplo.
No puedo decir
20

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 se nombre su reino 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 .

bola de lanza
fuente
Tenga en cuenta que OpenID Connect es básicamente un conjunto de estándares, de los cuales OAuth 2 es uno (JWT es otro)
Stijn de Witt
2
Este comentario es algo engañoso. OAuth2 es un estándar para implementar un protocolo de autorización. OIDC es un estándar que funciona sobre OAuth2 para la identificación.
Thomas Lann
16

En realidad, el vínculo a .well-knowestá en la primera pestaña de la configuración de su reino, pero el vínculo no parece un vínculo, sino como el valor del cuadro de texto ... mal diseño de interfaz de usuario. Captura de pantalla de la pestaña General de Realm

Vitaliy Markitanov
fuente
15

Después de mucho investigar, pudimos extraer la información más o menos (principalmente de la propia biblioteca del cliente JS de Keycloak):

  • Punto final de autorización: /auth/realms/{realm}/tokens/login
  • Punto final de 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 existe un parche que agrega que a partir de este escrito debería incluirse en 1.2.x.

Pero , irónicamente, Keycloak envía un mensaje id_tokenjunto con el token de acceso. Tanto el id_tokencomo el access_tokenson JWT firmados , y las claves del token son 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, sí "habla" en el idioma de OpenID Connect.

Amir Abiri
fuente
7

En la versión 1.9.0, json con todos los puntos finales está en address / auth / realms / {realm}

  • Extremo de autorización: / auth / realms / {realm} / account
  • Punto final de token: / auth / realms / {realm} / protocol / openid-connect
Krzysztof Pobozan
fuente
6

También puede ver esta información yendo a la Consola de administración -> Configuración del reino -> Haciendo clic en el hipervínculo en el campo Puntos finales.

ingrese la descripción de la imagen aquí

Anwar Husain
fuente
1
¿Sabe dónde se puede encontrar la documentación de estos puntos finales?
raarts
creo que la documentación podría haber sido un poco fácil de usar
Rohit Kumar
3

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
usuario1653042
fuente
sí, esto también es válido para 5.0. Están documentados aquí: keycloak.org/docs/5.0/server_admin/…
JP Lew
2

FQDN / auth / realms / {realm_name} /. Well-known / openid-configuration

verá todo aquí, además, si el proveedor de identidad también es Keycloak, la alimentación de esta URL configurará todo también con otros proveedores de identidad si lo admiten y ya lo manejaron

Haseb Ansari
fuente
2

Siguiente enlace Proporciona un documento JSON que describe metadatos sobre Keycloak

/auth/realms/{realm-name}/.well-known/openid-configuration

Siguiendo la información reportada con Keycloak 6.0.1 para masterreino

{  
   "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"
}
Ravthiru
fuente