จุดสิ้นสุด OAuth2 / OpenID Connect ของ Keycloak คืออะไร


99

เรากำลังพยายามประเมิน Keycloak เป็นโซลูชัน SSO และดูเหมือนว่าจะดีในหลาย ๆ ด้าน แต่เอกสารประกอบนั้นขาดข้อมูลพื้นฐานอย่างเจ็บปวด

สำหรับการติดตั้ง Keycloak ได้รับในhttp://localhost:8080/สำหรับ realm testสิ่งที่เป็นOAuth2 การอนุมัติ Endpoint , OAuth2 Token EndpointและOpenID Connect UserInfo Endpoint ?

เราไม่สนใจที่จะใช้ไลบรารีไคลเอ็นต์ของ Keycloak เราต้องการใช้ไลบรารีไคลเอ็นต์ OAuth2 / OpenID Connect มาตรฐานเนื่องจากแอปพลิเคชันไคลเอนต์ที่ใช้เซิร์ฟเวอร์ keycloak จะเขียนเป็นภาษาต่างๆ (PHP, Ruby, Node, Java, C # , เชิงมุม). ดังนั้นตัวอย่างที่ใช้ไคลเอนต์ Keycloak จึงไม่มีประโยชน์สำหรับเรา


1
คุณใช้อะไรแทน?
Ced

1
ในที่สุดเราก็สามารถโน้มน้าวได้ว่า OAuth ไม่มีส่วนเกี่ยวข้องกับการเข้าสู่ระบบและการรักษาความปลอดภัยเป็นเทคโนโลยีที่จะใช้ในแอปพลิเคชันเองและเกี่ยวข้องกับการผสานรวมกับบุคคลที่สามเท่านั้น เป็นเรื่องยากที่จะอธิบายความจริงที่ว่า Google และ FB ที่ใช้งานได้ทุกที่ไม่มีความเกี่ยวข้องกับเรา
Amir Abiri

6
@AmirAbiri จะไม่บอกว่ามันใช้สำหรับการรวมบุคคลที่สามเท่านั้น นั่นคือการใช้งานหลักในปัจจุบัน แต่การเป็นโปรโตคอลที่ บริษัท อินเทอร์เน็ตสนับสนุนมากขึ้นเรื่อย ๆ อาจเหมาะสมเช่นกันหากคุณกำลังจัดการกับแอปพลิเคชันหลายตัว (หรือไมโครเซอร์วิส) ในสภาพแวดล้อมองค์กรของคุณเองและคุณต้องการโซลูชัน SSO จริงๆแล้วในกรณีของฉันเมื่อใช้ keycloak มานานกว่า 10 เดือนแล้วฉันคิดว่ามันอาจจะเหมาะกับแอปพลิเคชั่นที่เรียบง่ายเพราะดูแลทุกอย่างในการจัดการผู้ใช้
Xtreme Biker

คำตอบ:


131

สำหรับ Keycloak 1.2 ข้อมูลข้างต้นสามารถเรียกดูได้ทาง url

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

ตัวอย่างเช่นหากชื่อขอบเขตคือการสาธิต :

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

ตัวอย่างผลลัพธ์จาก 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"
    ]
}

พบข้อมูลที่https://issues.jboss.org/browse/KEYCLOAK-571

หมายเหตุ: คุณอาจต้องเพิ่มไคลเอนต์ของคุณในรายการURI การเปลี่ยนเส้นทางที่ถูกต้อง


1
ตั้งแต่นั้นมาเราได้ยกเลิกโดยใช้ Keycloak ดังนั้นฉันจึงไม่สามารถยืนยันได้
Amir Abiri

URL ใดที่จะใช้เพื่อมีลิงค์เข้าสู่ระบบบนเว็บแอป คุณลองทุกอย่างแล้ว แต่พวกเขาไม่ทำ
Ced

2
@AmirAbiri คุณมีทางเลือกอื่นสำหรับ KeyCloak อย่างไร? ฉันกำลังประเมินอยู่ มันเหมือนกับ UI และต้องการให้ผู้ใช้ทั้งหมดของฉันจัดการได้ แต่ฉันประสบปัญหาในการแนบแอปพลิเคชัน GoLang เข้ากับมัน
Tarion

@Tarion มีเซิร์ฟเวอร์ข้อมูลประจำตัว WSO2 สำหรับหนึ่ง
ไม่สามารถบอกได้

20

ด้วยเวอร์ชัน 1.9.3 Final Keycloak มีจุดสิ้นสุด OpenID จำนวนมาก /auth/realms/{realm}/.well-known/openid-configurationเหล่านี้สามารถพบได้ที่ สมมติว่ามีการตั้งชื่อขอบเขตของคุณdemoจุดสิ้นสุดนั้นจะสร้างการตอบสนอง JSON ในลักษณะนี้

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

เท่าที่ฉันพบจุดสิ้นสุดเหล่านี้ใช้ข้อมูลจำเพาะOauth 2.0


โปรดทราบว่า OpenID Connect นั้นเป็นชุดของมาตรฐานซึ่ง OAuth 2 เป็นหนึ่ง (JWT คืออีกอันหนึ่ง)
Stijn de Witt

2
ความคิดเห็นนี้ค่อนข้างทำให้เข้าใจผิด OAuth2 เป็นมาตรฐานในการใช้โปรโตคอลสำหรับการอนุญาต OIDC เป็นมาตรฐานที่ทำงานเหนือ OAuth2 เพื่อระบุตัวตน
Thomas Lann

16

ลิงก์ไปที่จริงแล้ว.well-knowอยู่ในแท็บแรกของการตั้งค่าขอบเขตของคุณ แต่ลิงก์จะไม่เหมือนลิงก์ แต่เป็นค่าของกล่องข้อความ ... การออกแบบ UI ที่ไม่ดี สกรีนช็อตของแท็บทั่วไปของ Realm


15

หลังจากขุดรอบ ๆ เราก็สามารถขูดข้อมูลได้มากหรือน้อย (ส่วนใหญ่มาจาก lib ไคลเอ็นต์ JS ของ Keycloak):

  • จุดสิ้นสุดการให้สิทธิ์: /auth/realms/{realm}/tokens/login
  • ปลายทางโทเค็น: /auth/realms/{realm}/tokens/access/codes

สำหรับOpenID Connect UserInfoตอนนี้ (1.1.0.Final) Keycloak ไม่ได้ใช้จุดสิ้นสุดนี้ดังนั้นจึงไม่สอดคล้องกับ OpenID Connect อย่างสมบูรณ์ อย่างไรก็ตามมีโปรแกรมแก้ไขอยู่แล้วที่เพิ่มว่าควรจะรวมไว้ใน 1.2.x.

แต่ - กระแทกแดกดัน Keycloak จะส่งกลับid_tokenเข้าพร้อมกับโทเค็นการเข้าถึง ทั้งสองid_tokenและaccess_tokenกำลังJWTs ลงนามและกุญแจของโทเค็นเป็นกุญแจ OpenID Connect ของเช่น:

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

ดังนั้นในขณะที่ Keycloak 1.1.x ไม่เป็นไปตามมาตรฐาน OpenID Connect อย่างสมบูรณ์ แต่ก็ "speak" ในภาษา OpenID Connect


7

ในเวอร์ชัน 1.9.0 json ที่มีจุดสิ้นสุดทั้งหมดอยู่ที่ address / auth / realms / {realm}

  • Authorization Endpoint: / auth / realms / {realm} / account
  • Token Endpoint: / auth / realms / {realm} / protocol / openid-connect

6

คุณยังสามารถดูข้อมูลนี้ได้โดยไปที่คอนโซลผู้ดูแลระบบ -> การตั้งค่าขอบเขต -> คลิกที่ไฮเปอร์ลิงก์ในช่องปลายทาง

ป้อนคำอธิบายภาพที่นี่


1
คุณทราบหรือไม่ว่าเอกสารสำหรับจุดสิ้นสุดเหล่านี้สามารถหาได้จากที่ใด
raarts

คุณฉันรู้สึกว่าเอกสารอาจเป็นเรื่องง่ายสำหรับผู้ใช้
Rohit Kumar


2

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

คุณจะเห็นทุกอย่างที่นี่รวมทั้งหากผู้ให้บริการข้อมูลประจำตัวยังเป็น Keycloak การป้อน URL นี้จะตั้งค่าทุกอย่างกับผู้ให้บริการข้อมูลประจำตัวอื่น ๆ หากพวกเขารองรับและพวกเขาจัดการไปแล้ว


2

ลิงก์ต่อไปนี้จัดเตรียมเอกสาร JSON ที่อธิบายข้อมูลเมตาเกี่ยวกับ Keycloak

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

ข้อมูลต่อไปนี้รายงานด้วย Keycloak 6.0.1 สำหรับ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"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.