Điểm cuối OAuth2 / OpenID Connect của Keycloak là gì?


99

Chúng tôi đang cố gắng đánh giá Keycloak như một giải pháp SSO và nó có vẻ tốt ở nhiều khía cạnh, nhưng tài liệu này rất thiếu những điều cơ bản.

Đối với cài đặt Keycloak nhất định trên http://localhost:8080/cho cảnh giới test, Điểm cuối cấp phép OAuth2 , Điểm cuối mã thông báo OAuth2 và Điểm cuối kết nối người dùng OpenID là gì?

Chúng tôi không quan tâm đến việc sử dụng thư viện máy khách của chính Keycloak, chúng tôi muốn sử dụng các thư viện máy khách OAuth2 / OpenID Connect tiêu chuẩn, vì các ứng dụng khách sử dụng máy chủ keycloak sẽ được viết bằng nhiều ngôn ngữ (PHP, Ruby, Node, Java, C # , Góc). Do đó, các ví dụ sử dụng ứng dụng khách Keycloak không được sử dụng cho chúng tôi.


1
Thay vào đó, bạn đã sử dụng cái gì?
Ced

1
Cuối cùng, chúng tôi đã có thể thuyết phục ở tầng trên rằng OAuth không liên quan gì đến đăng nhập và bảo mật như một công nghệ để sử dụng trong chính ứng dụng và chỉ phù hợp để tích hợp với các bên thứ ba. Thật khó để giải thích việc Google & FB sử dụng nó ở khắp mọi nơi không liên quan đến chúng tôi.
Amir Abiri

6
@AmirAbiri sẽ không nói rằng nó chỉ được sử dụng để tích hợp bên thứ ba. Đó là cách sử dụng chính của nó hiện nay, nhưng, là một giao thức mà ngày càng nhiều công ty internet hỗ trợ, cũng có thể có ý nghĩa nếu bạn đang xử lý nhiều ứng dụng (hoặc microservices) trong môi trường doanh nghiệp của riêng mình và bạn muốn có một giải pháp SSO. Thực sự trong trường hợp của tôi, đã sử dụng keycloak hơn 10 tháng nay, tôi nghĩ nó cũng có thể xứng đáng cho các ứng dụng đơn giản, vì nó đảm nhận tất cả các công cụ quản lý người dùng.
Xtreme Biker

Câu trả lời:


131

Đối với Keycloak 1.2, thông tin trên có thể được truy xuất qua url

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

Ví dụ: nếu tên cảnh giới là bản demo :

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

Một ví dụ đầu ra từ url trên:

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

Thông tin tìm thấy tại https://issues.jboss.org/browse/KEYCLOAK-571

Lưu ý: Bạn có thể cần thêm khách hàng của mình vào danh sách URI chuyển hướng hợp lệ


1
Kể từ đó, chúng tôi đã hủy sử dụng Keycloak, vì vậy tôi không thể xác minh.
Amir Abiri

Người ta sẽ sử dụng URL nào để có liên kết đăng nhập trên ứng dụng web? U thử tất cả những người mà họ không làm được điều đó
CED

2
@AmirAbiri giải pháp thay thế cho KeyCloak của bạn là gì? Tôi hiện đang đánh giá nó. Nó giống như giao diện người dùng và muốn có tất cả người dùng của tôi được quản lý bởi nó nhưng tôi gặp khó khăn trong việc cài đặt ứng dụng GoLang của mình với nó.
Tarion

@Tarion Có một máy chủ nhận dạng WSO2.
Không thể nói

20

Với phiên bản 1.9.3.Final, Keycloak có sẵn một số điểm cuối OpenID. Những điều này có thể được tìm thấy tại /auth/realms/{realm}/.well-known/openid-configuration. Giả sử lĩnh vực của bạn được đặt tên demo, điểm cuối đó sẽ tạo ra phản hồi JSON tương tự như thế này.

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

Theo như tôi đã tìm thấy, các điểm cuối này triển khai thông số kỹ thuật Oauth 2.0 .


Lưu ý rằng OpenID Connect cơ bản là một bộ tiêu chuẩn, trong đó OAuth 2 là một (JWT là khác)
Stijn de Witt

2
Nhận xét này có phần sai lệch. OAuth2 là một tiêu chuẩn để triển khai một giao thức để ủy quyền. OIDC là một tiêu chuẩn hoạt động trên OAuth2 để nhận dạng.
Thomas Lann


15

Sau nhiều lần tìm hiểu, chúng tôi đã có thể thu thập thông tin ít nhiều (chủ yếu từ lib client JS của Keycloak):

  • Điểm cuối ủy quyền: /auth/realms/{realm}/tokens/login
  • Điểm cuối mã thông báo: /auth/realms/{realm}/tokens/access/codes

Đối với OpenID Connect UserInfo , Keycloak hiện tại (1.1.0.Final) không triển khai điểm cuối này, vì vậy nó không hoàn toàn tuân thủ OpenID Connect. Tuy nhiên, đã có một bản vá bổ sung rằng tính đến thời điểm viết bài này nên được đưa vào 1.2.x.

Nhưng - Trớ trêu thay, Keycloak lại gửi lại một tài khoản id_tokencùng với mã thông báo truy cập. Cả hai id_tokenaccess_tokenđều là JWT đã ký và các khóa của mã thông báo là khóa của OpenID Connect, tức là:

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

Vì vậy, mặc dù Keycloak 1.1.x không hoàn toàn tuân thủ OpenID Connect, nhưng nó vẫn "nói" bằng ngôn ngữ OpenID Connect.


7

Trong phiên bản 1.9.0 json với tất cả các điểm cuối đều ở địa chỉ / auth / domains / {domains}

  • Điểm cuối cấp phép: / auth / domains / {domains} / account
  • Điểm cuối mã thông báo: / auth / domains / {domains} / protocol / openid-connect

6

Bạn cũng có thể xem thông tin này bằng cách vào Bảng điều khiển dành cho quản trị viên -> Cài đặt khung cảnh -> Nhấp vào siêu liên kết trên trường Điểm cuối.

nhập mô tả hình ảnh ở đây


1
Bạn có biết tài liệu có thể được tìm thấy ở đâu cho các điểm cuối này không?
raarts

bạn, tôi cảm thấy tài liệu có thể hơi thân thiện với người dùng
Rohit Kumar


2

FQDN / auth / domains / {domains_name} /. Well-known / openid-configuration

bạn sẽ thấy mọi thứ ở đây, ngoài ra nếu nhà cung cấp danh tính cũng là Keycloak thì việc cung cấp URL này sẽ thiết lập mọi thứ cũng đúng với các nhà cung cấp danh tính khác nếu họ hỗ trợ và họ đã xử lý nó


2

Liên kết sau Cung cấp tài liệu JSON mô tả siêu dữ liệu về Keycloak

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

Thông tin sau được báo cáo với Keycloak 6.0.1 cho mastercảnh giới

{  
   "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"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.