Keycloak 的 OAuth2 / OpenID Connect 端点是啥?
Posted
技术标签:
【中文标题】Keycloak 的 OAuth2 / OpenID Connect 端点是啥?【英文标题】:What are Keycloak's OAuth2 / OpenID Connect endpoints?Keycloak 的 OAuth2 / OpenID Connect 端点是什么? 【发布时间】:2015-04-23 21:19:16 【问题描述】:我们正在尝试将 Keycloak 评估为 SSO 解决方案,它在许多方面看起来都不错,但文档在基础知识方面非常缺乏。
对于领域test
的http://localhost:8080/
上的给定Keycloak 安装,OAuth2 Authorization Endpoint、OAuth2 Token Endpoint 和OpenID Connect UserInfo Endpoint 是什么?
我们对使用 Keycloak 自己的客户端库不感兴趣,我们希望使用标准的 OAuth2 / OpenID Connect 客户端库,因为使用 keycloak 服务器的客户端应用程序将使用多种语言(php、Ruby、Node、 Java、C#、角度)。因此,使用 Keycloak 客户端的示例对我们没有用处。
【问题讨论】:
你最终改用了什么? 我们终于能够说服楼上的,OAuth 作为应用程序本身使用的一种技术与登录和安全无关,仅与与第 3 方集成有关。很难解释这样一个事实,即到处使用它的 Google 和 FB 与我们无关。 @AmirAbiri 不会说它仅用于第 3 方集成。这是它现在的主要用途,但是,作为越来越多的互联网公司支持的协议,如果您在自己的企业环境中处理多个应用程序(或微服务)并且想要 SSO 解决方案,它也可能有意义。实际上,就我而言,我已经使用 keycloak 超过 10 个月了,我认为它可能也适用于简单的应用程序,因为它负责所有用户管理工作。 【参考方案1】:对于 Keycloak 1.2,可以通过 url 检索上述信息
http://keycloakhost:keycloakport/auth/realms/realm/.well-known/openid-configuration
例如,如果领域名称是demo:
http://keycloakhost:keycloakport/auth/realms/demo/.well-known/openid-configuration
上述网址的示例输出:
"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 列表
【讨论】:
从那以后我们就放弃了使用 Keycloak,所以我无法验证。 在 Web 应用程序上使用什么 URL 来获得登录链接?你尝试了所有这些,但他们没有这样做 @AmirAbiri KeyCloak 的替代品是什么?我目前正在评估它。它喜欢 UI,并希望我的所有用户都由它管理,但我很难将我的 GoLang 应用程序附加到它。 @Tarion 有一个 WSO2 身份服务器。 我在 Keycloak 上苦苦挣扎,直到我发现这篇带有神奇 URL 的帖子!【参考方案2】:在 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 是另一个) 这条评论有点误导。 OAuth2 是实现授权协议的标准。 OIDC 是一种在 OAuth2 之上进行识别的标准。【参考方案3】:实际上链接到.well-know
是在您的领域设置的第一个选项卡上 - 但链接看起来不像链接,而是作为文本框的值......糟糕的用户界面设计。
Screenshot of Realm's General Tab
【讨论】:
【参考方案4】:经过大量挖掘,我们能够或多或少地抓取信息(主要来自 Keycloak 自己的 JS 客户端库):
授权端点:/auth/realms/realm/tokens/login
令牌端点: /auth/realms/realm/tokens/access/codes
至于 OpenID Connect UserInfo,目前 (1.1.0.Final) Keycloak 没有实现此端点,因此它不完全符合 OpenID Connect。但是,已经有一个patch 补充说,在撰写本文时应该包含在 1.2.x 中。
但是 - 具有讽刺意味的是,Keycloak 确实将id_token
与访问令牌一起发回。 id_token
和access_token
都是signed JWTs,token的key是OpenID Connect的key,即:
"iss": "realm"
"sub": "5bf30443-0cf7-4d31-b204-efd11a432659"
"name": "Amir Abiri"
"email: "..."
因此,虽然 Keycloak 1.1.x 不完全兼容 OpenID Connect,但它确实以 OpenID Connect 语言“说话”。
【讨论】:
【参考方案5】:在 1.9.0 版本中,所有端点的 json 位于地址 /auth/realms/realm
授权端点: /auth/realms/realm/account 令牌端点: /auth/realms/realm/protocol/openid-connect【讨论】:
【参考方案6】:您还可以通过进入管理控制台 -> 领域设置 -> 单击端点字段上的超链接来查看此信息。
【讨论】:
您知道在哪里可以找到这些端点的文档吗? 你我觉得文档可能有点用户友好【参考方案7】:keycloak 版本:4.6.0
TokenUrl:[域]/auth/realms/REALM_NAME/protocol/openid-connect/token AuthUrl:[域]/auth/realms/REALM_NAME/protocol/openid-connect/auth【讨论】:
是的,这也适用于 5.0。它们记录在这里:keycloak.org/docs/5.0/server_admin/…【参考方案8】:以下链接提供描述有关 Keycloak 元数据的 JSON 文档
/auth/realms/realm-name/.well-known/openid-configuration
使用 Keycloak 6.0.1 为master
领域报告的以下信息
"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"
【讨论】:
【参考方案9】:FQDN/auth/realms/realm_name/.well-known/openid-configuration
您将在此处看到所有内容,此外,如果身份提供者也是 Keycloak,则提供此 URL 将设置所有其他身份提供者(如果他们支持并且已经处理)也适用
【讨论】:
以上是关于Keycloak 的 OAuth2 / OpenID Connect 端点是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak 的 OAuth2 / OpenID Connect 端点是啥?
Keycloak、oauth2-proxy 和 nginx.ingress.kubernetes
Spring OAuth2 使用 Keycloak 自动登录
如何使用 Angular -> Spring Boot Oauth2 -> Keycloak 获取 keycloak 令牌