Czym są punkty końcowe OAuth2 / OpenID Connect firmy Keycloak?

103

Próbujemy ocenić Keycloak jako rozwiązanie SSO i wygląda dobrze pod wieloma względami, ale w dokumentacji bardzo brakuje podstaw.

Co to jest punkt końcowy autoryzacji OAuth2 , punkt końcowy tokenu OAuth2 i punkt końcowy informacji o użytkowniku OpenID Connect w przypadku danej instalacji Keycloak w http://localhost:8080/domenie ?test

Nie jesteśmy zainteresowani korzystaniem z własnej biblioteki klienta Keycloak, chcemy korzystać ze standardowych bibliotek klienta OAuth2 / OpenID Connect, ponieważ aplikacje klienckie korzystające z serwera keycloak będą pisane w szerokim zakresie języków (PHP, Ruby, Node, Java, C # , Kątowy). Dlatego przykłady korzystające z klienta Keycloak nie są dla nas przydatne.

Amir Abiri
źródło
1
Czego zamiast tego użyłeś?
Ced
1
W końcu udało nam się przekonać na górze, że OAuth nie ma nic wspólnego z logowaniem i bezpieczeństwem jako technologią używaną w samej aplikacji i ma znaczenie tylko w przypadku integracji ze stronami trzecimi. Trudno było wytłumaczyć fakt, że używanie go wszędzie przez Google i FB nie ma dla nas żadnego znaczenia.
Amir Abiri
6
@AmirAbiri nie powiedziałby, że jest używany tylko do integracji ze stronami trzecimi. To jest jego główne zastosowanie w dzisiejszych czasach, ale będąc protokołem obsługiwanym przez coraz więcej firm internetowych, może mieć również sens, jeśli masz do czynienia z wieloma aplikacjami (lub mikrousługami) we własnym środowisku przedsiębiorstwa i potrzebujesz rozwiązania SSO. Właściwie w moim przypadku, używając Keycloak od ponad 10 miesięcy, myślę, że może również zasługiwać na proste aplikacje, ponieważ zajmuje się wszystkimi sprawami związanymi z zarządzaniem użytkownikami.
Xtreme Biker

Odpowiedzi:

138

W przypadku Keycloak 1.2 powyższe informacje można pobrać za pośrednictwem adresu URL

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

Na przykład, jeśli nazwa dziedziny to demo :

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

Przykładowe wyjście z powyższego adresu URL:

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

Informacje można znaleźć pod adresem https://issues.jboss.org/browse/KEYCLOAK-571

Uwaga: Może być konieczne, aby dodać klienta do Ważna Przekierowanie URI listy

Nie mogę powiedzieć
źródło
1
Od tego czasu zrezygnowaliśmy z używania Keycloak, więc nie mogę zweryfikować.
Amir Abiri
Jakiego adresu URL można użyć, aby mieć łącze logowania w aplikacji internetowej? Próbowałeś wszystkich tych, ale tego nie robią
środa,
2
@AmirAbiri Jaka jest Twoja alternatywa dla KeyCloak? Obecnie to oceniam. Podoba mi się interfejs użytkownika i chciałbym, aby wszyscy moi użytkownicy byli przez niego zarządzani, ale mam trudności z dołączeniem do niego mojej aplikacji GoLang.
Tarion
@Tarion Na przykład istnieje serwer tożsamości WSO2.
Can't Tell
20

W wersji 1.9.3.Final Keycloak udostępnia wiele punktów końcowych OpenID. Można je znaleźć pod adresem /auth/realms/{realm}/.well-known/openid-configuration. Zakładając, że twoja dziedzina ma nazwę demo, ten punkt końcowy wygeneruje odpowiedź JSON podobną do tej.

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

O ile znalazłem, te punkty końcowe implementują specyfikację Oauth 2.0 .

lanceball
źródło
Zwróć uwagę, że OpenID Connect to w zasadzie zestaw standardów, z których jednym jest OAuth 2 (JWT to drugi)
Stijn de Witt
2
Ten komentarz jest nieco mylący. OAuth2 to standard implementujący protokół autoryzacji. OIDC to standard, który działa ponad OAuth2 w celu identyfikacji.
Thomas Lann
16

Właściwie link do .well-knowznajduje się na pierwszej karcie ustawień domeny - ale link nie wygląda jak link, ale jako wartość pola tekstowego ... zły projekt interfejsu użytkownika. Zrzut ekranu karty Ogólne Realm

Vitaliy Markitanov
źródło
15

Po długich poszukiwaniach byliśmy w stanie zebrać mniej więcej informacje (głównie z biblioteki klienta JS Keycloak):

  • Punkt końcowy autoryzacji: /auth/realms/{realm}/tokens/login
  • Punkt końcowy tokenu: /auth/realms/{realm}/tokens/access/codes

Jeśli chodzi o informacje o użytkowniku OpenID Connect , w tej chwili (1.1.0.Final) Keycloak nie implementuje tego punktu końcowego, więc nie jest w pełni zgodny z OpenID Connect. Jednak istnieje już łatka, która dodaje, że w chwili pisania tego tekstu powinno być zawarte w 1.2.x.

Ale - jak na ironię Keycloak odsyła id_tokenrazem z tokenem dostępu. Zarówno id_tokeni access_tokenpodpisane JWTs i klucze token są klucze OpenID Connect, tj:

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

Tak więc chociaż Keycloak 1.1.x nie jest w pełni zgodny z OpenID Connect, „mówi” w języku OpenID Connect.

Amir Abiri
źródło
7

W wersji 1.9.0 json ze wszystkimi punktami końcowymi znajduje się pod adresem address / auth / realms / {realm}

  • Punkt końcowy autoryzacji: / auth / realms / {realm} / account
  • Punkt końcowy tokenu: / auth / realms / {realm} / protocol / openid-connect
Krzysztof Pobozan
źródło
7

Możesz również zobaczyć te informacje, przechodząc do Konsoli administracyjnej -> Ustawienia dziedziny -> Klikając hiperłącze w polu Punkty końcowe.

wprowadź opis obrazu tutaj

Anwar Husain
źródło
1
Czy wiesz, gdzie można znaleźć dokumentację dotyczącą tych punktów końcowych?
raarts
czuję, że dokumentacja mogłaby być trochę przyjazna dla użytkownika
Rohit Kumar
3

wersja keycloak: 4.6.0

  • TokenUrl: [domena] / auth / realms / {REALM_NAME} / protokół / openid-connect / token
  • AuthUrl: [domena] / auth / realms / {REALM_NAME} / protokół / openid-connect / auth
user1653042
źródło
tak, dotyczy to również wersji 5.0. Są one udokumentowane tutaj: keycloak.org/docs/5.0/server_admin/…
JP Lew
2

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

zobaczysz tutaj wszystko, a jeśli dostawca tożsamości jest również Keycloak, podanie tego adresu URL skonfiguruje wszystko również w przypadku innych dostawców tożsamości, jeśli obsługują i już to obsłużyli

Haseb Ansari
źródło
2

Poniższy link Udostępnia dokument JSON opisujący metadane dotyczące Keycloak

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

Następujące informacje zgłoszone za pomocą Keycloak 6.0.1 dla masterdomeny

{  
   "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
źródło