Apa itu endpoint OAuth2 / OpenID Connect Keycloak?


100

Kami mencoba mengevaluasi Keycloak sebagai solusi SSO, dan terlihat bagus dalam banyak hal, tetapi dokumentasinya sangat kurang dalam dasar-dasarnya.

Untuk penginstalan Keycloak tertentu di http://localhost:8080/realm test, apa itu OAuth2 Authorization Endpoint , OAuth2 Token Endpoint, dan OpenID Connect UserInfo Endpoint ?

Kami tidak tertarik menggunakan pustaka klien Keycloak sendiri, kami ingin menggunakan pustaka klien standar OAuth2 / OpenID Connect, karena aplikasi klien yang menggunakan server keycloak akan ditulis dalam berbagai bahasa (PHP, Ruby, Node, Java, C # , Angular). Oleh karena itu, contoh yang menggunakan klien Keycloak tidak berguna bagi kami.


1
Apa yang akhirnya Anda gunakan?
Menyerahkan

1
Kami akhirnya dapat meyakinkan di lantai atas bahwa OAuth tidak ada hubungannya dengan login dan keamanan sebagai teknologi untuk digunakan dalam aplikasi itu sendiri, dan hanya relevan untuk berintegrasi dengan pihak ketiga. Sulit untuk menjelaskan fakta bahwa Google & FB yang menggunakannya di mana-mana tidak ada relevansinya dengan kami.
Amir Abiri

6
@AmirAbiri tidak akan mengatakan itu digunakan untuk integrasi pihak ke-3 saja. Itulah kegunaan utamanya saat ini, tetapi, menjadi protokol yang semakin banyak didukung oleh perusahaan internet, mungkin masuk akal juga jika Anda berurusan dengan banyak aplikasi (atau layanan mikro) di lingkungan perusahaan Anda sendiri dan Anda menginginkan solusi SSO. Sebenarnya dalam kasus saya, setelah menggunakan keycloak selama lebih dari 10 bulan sekarang, saya pikir itu mungkin juga layak untuk aplikasi sederhana, karena menangani semua hal manajemen pengguna.
Xtreme Biker

Jawaban:


133

Untuk Keycloak 1.2 informasi di atas dapat diambil melalui url

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

Misalnya, jika nama realme adalah demo :

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

Contoh keluaran dari url di atas:

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

Informasi ditemukan di https://issues.jboss.org/browse/KEYCLOAK-571

Catatan: Anda mungkin perlu menambahkan klien Anda ke daftar URI Pengalihan Valid


1
Kami sejak saat itu telah membuang penggunaan Keycloak, jadi saya tidak dapat memverifikasi.
Amir Abiri

URL apa yang akan digunakan seseorang untuk memiliki tautan masuk di aplikasi web? U mencoba semua itu tetapi mereka tidak melakukannya
Ced

2
@AmirAbiri apa alternatif Anda untuk KeyCloak? Saya sedang mengevaluasinya. Ia menyukai UI dan ingin semua pengguna saya dikelola olehnya tetapi saya mengalami kesulitan menyesuaikan aplikasi GoLang saya dengannya.
Tarion

@Tarion Ada server identitas WSO2, untuk satu.
Can't Tell

20

Dengan versi 1.9.3. Final, Keycloak memiliki sejumlah titik akhir OpenID yang tersedia. Ini dapat ditemukan di /auth/realms/{realm}/.well-known/openid-configuration. Dengan asumsi ranah Anda diberi nama demo, titik akhir itu akan menghasilkan respons JSON yang serupa dengan ini.

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

Sejauh yang saya temukan, titik akhir ini mengimplementasikan spesifikasi Oauth 2.0 .


Perhatikan bahwa OpenID Connect pada dasarnya adalah seperangkat standar, di mana OAuth 2 adalah salah satunya (JWT adalah yang lain)
Stijn de Witt

2
Komentar ini agak menyesatkan. OAuth2 adalah standar untuk menerapkan protokol untuk otorisasi. OIDC adalah standar yang berfungsi di atas OAuth2 untuk identifikasi.
Thomas Lann


15

Setelah banyak menggali, kami dapat mengikis info lebih banyak atau lebih sedikit (terutama dari lib klien JS Keycloak sendiri):

  • Titik Akhir Otorisasi: /auth/realms/{realm}/tokens/login
  • Token Endpoint: /auth/realms/{realm}/tokens/access/codes

Sedangkan untuk OpenID Connect UserInfo , saat ini (1.1.0.Final) Keycloak tidak mengimplementasikan endpoint ini, jadi tidak sepenuhnya sesuai dengan OpenID Connect. Namun demikian, sudah ada patch yang menambahkan bahwa saat tulisan ini dibuat harus dimasukkan ke dalam 1.2.x.

Tapi - Ironisnya Keycloak mengirim kembali id_tokenbersama dengan token akses. Baik id_tokendan access_tokenyang JWTs ditandatangani , dan kunci-kunci token adalah kunci OpenID Connect ini, yaitu:

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

Jadi, meskipun Keycloak 1.1.x tidak sepenuhnya kompatibel dengan OpenID Connect, ia "berbicara" dalam bahasa OpenID Connect.


7

Dalam versi 1.9.0 json dengan semua titik akhir ada di alamat / auth / realms / {realm}

  • Titik Akhir Otorisasi: / auth / realms / {realm} / account
  • Token Endpoint: / auth / realms / {realm} / protocol / openid-connect

6

Anda juga dapat melihat informasi ini dengan masuk ke Konsol Admin -> Pengaturan Realm -> Mengklik hyperlink di bidang Titik Akhir.

masukkan deskripsi gambar di sini


1
Tahukah Anda di mana dokumentasi dapat ditemukan untuk titik akhir ini?
raarts

Anda, saya merasa bahwa dokumentasi mungkin sedikit lebih ramah pengguna
Rohit Kumar


2

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

Anda akan melihat semuanya di sini, ditambah jika penyedia identitas juga Keycloak, maka memberi makan URL ini akan mengatur semuanya juga benar dengan penyedia identitas lain jika mereka mendukung dan mereka sudah menanganinya


2

Tautan berikut Menyediakan dokumen JSON yang menjelaskan metadata tentang Keycloak

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

Informasi berikut dilaporkan dengan Keycloak 6.0.1 untuk 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"
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.