Cosa sono gli endpoint OAuth2 / OpenID Connect di Keycloak?


99

Stiamo cercando di valutare Keycloak come una soluzione SSO, e sembra buono sotto molti aspetti, ma la documentazione è dolorosamente carente nelle basi.

Per una determinata installazione di Keycloak su http://localhost:8080/per realm test, cosa sono l' endpoint di autorizzazione OAuth2 , l' endpoint token OAuth2 e l' endpoint OpenID Connect UserInfo ?

Non siamo interessati a utilizzare la libreria client di Keycloak, vogliamo utilizzare le librerie client OAuth2 / OpenID Connect standard, poiché le applicazioni client che utilizzano il server keycloak saranno scritte in un'ampia gamma di linguaggi (PHP, Ruby, Node, Java, C # , Angolare). Pertanto gli esempi che utilizzano il client Keycloak non sono utili per noi.


1
Cosa hai finito per usare invece?
Ced il

1
Finalmente siamo stati in grado di convincere al piano di sopra che OAuth non ha nulla a che fare con l'accesso e la sicurezza come tecnologia da utilizzare nell'applicazione stessa ed è rilevante solo per l'integrazione con terze parti. È stato difficile spiegare il fatto che Google e FB lo utilizzano ovunque non ha rilevanza per noi.
Amir Abiri

6
@AmirAbiri non direbbe che è utilizzato solo per l'integrazione di terze parti. Questo è il suo utilizzo principale al giorno d'oggi, ma, essendo un protocollo supportato da sempre più società Internet, potrebbe avere senso anche se hai a che fare con più applicazioni (o microservizi) nel tuo ambiente aziendale e desideri una soluzione SSO. In realtà nel mio caso, avendo utilizzato il keycloak per più di 10 mesi, penso che potrebbe meritare anche per applicazioni semplici, poiché si occupa di tutte le cose di gestione degli utenti.
Xtreme Biker

Risposte:


131

Per Keycloak 1.2 le informazioni di cui sopra possono essere recuperate tramite l'URL

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

Ad esempio, se il nome dell'area di autenticazione è demo :

http: // keycloakhost: keycloakport / auth / realms / demo / .well-known / openid-configuration

Un esempio di output dall'URL sopra:

{
    "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"
    ]
}

Informazioni trovate su https://issues.jboss.org/browse/KEYCLOAK-571

Nota: potrebbe essere necessario aggiungere il client all'elenco URI di reindirizzamento valido


1
Da allora abbiamo eliminato l'utilizzo di Keycloak, quindi non posso verificare.
Amir Abiri

Quale URL si utilizzerebbe per avere un collegamento di accesso su un'app Web? Hai provato tutti quelli ma non l'hanno fatto
Ced il

2
@AmirAbiri qual è la tua alternativa a KeyCloak? Lo sto attualmente valutando. Mi piace l'interfaccia utente e vorrei che tutti i miei utenti fossero gestiti da essa, ma ho difficoltà ad associarvi la mia applicazione GoLang.
Tarion

@ Tarion C'è un server di identità WSO2, per esempio.
Non posso dirlo

20

Con la versione 1.9.3.Final, Keycloak ha una serie di endpoint OpenID disponibili. Questi possono essere trovati su /auth/realms/{realm}/.well-known/openid-configuration. Supponendo che il tuo dominio sia denominato demo, quell'endpoint produrrà una risposta JSON simile a questa.

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

Per quanto ho scoperto, questi endpoint implementano le specifiche Oauth 2.0 .


Nota che OpenID Connect è fondamentalmente un insieme di standard, di cui OAuth 2 è uno (JWT è un altro)
Stijn de Witt

2
Questo commento è alquanto fuorviante. OAuth2 è uno standard per implementare un protocollo per l'autorizzazione. OIDC è uno standard che funziona su OAuth2 per l'identificazione.
Thomas Lann


15

Dopo molte ricerche, siamo stati in grado di raccogliere le informazioni più o meno (principalmente dalla libreria del client JS di Keycloak):

  • Endpoint di autorizzazione: /auth/realms/{realm}/tokens/login
  • Endpoint token: /auth/realms/{realm}/tokens/access/codes

Per quanto riguarda OpenID Connect UserInfo , al momento (1.1.0.Final) Keycloak non implementa questo endpoint, quindi non è completamente conforme a OpenID Connect. Tuttavia, esiste già una patch che aggiunge che al momento della stesura di questo documento dovrebbe essere inclusa nella 1.2.x.

Ma - Ironia della sorte Keycloak restituisce un id_tokenin insieme al token di accesso. Sia il id_tokenche il access_tokensono JWT firmati e le chiavi del token sono chiavi di OpenID Connect, ovvero:

"iss":  "{realm}"
"sub":  "5bf30443-0cf7-4d31-b204-efd11a432659"
"name": "Amir Abiri"
"email: "..."

Quindi, sebbene Keycloak 1.1.x non sia completamente conforme a OpenID Connect, "parla" nella lingua OpenID Connect.


7

Nella versione 1.9.0, json con tutti gli endpoint è all'indirizzo / auth / realms / {realm}

  • Endpoint di autorizzazione: / auth / realms / {realm} / account
  • Endpoint token: / auth / realms / {realm} / protocol / openid-connect

6

Puoi anche visualizzare queste informazioni andando in Admin Console -> Impostazioni realm -> facendo clic sul collegamento ipertestuale nel campo Endpoint.

inserisci qui la descrizione dell'immagine


1
Sai dove è possibile trovare la documentazione per questi endpoint?
raarts il

sento che la documentazione avrebbe potuto essere un po 'facile da usare
Rohit Kumar

3

versione keycloak: 4.6.0

  • TokenUrl: [dominio] / auth / realms / {REALM_NAME} / protocol / openid-connect / token
  • AuthUrl: [dominio] / auth / realms / {REALM_NAME} / protocol / openid-connect / auth

sì, questo vale anche per 5.0. Sono documentati qui: keycloak.org/docs/5.0/server_admin/…
JP Lew

2

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

vedrai tutto qui, inoltre se il provider di identità è anche Keycloak, alimentare questo URL configurerà tutto vero anche con altri provider di identità se supportano e lo hanno già gestito


2

Collegamento seguente Fornisce un documento JSON che descrive i metadati sul Keycloak

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

Di seguito le informazioni riportate con Keycloak 6.0.1 per masterrealm

{  
   "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"
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.