【问题标题】:What are Keycloak's OAuth2 / OpenID Connect endpoints?Keycloak 的 OAuth2 / OpenID Connect 端点是什么?
【发布时间】:2015-04-23 21:19:16
【问题描述】:

我们正在尝试将 Keycloak 评估为 SSO 解决方案,它在许多方面看起来都不错,但文档在基础知识方面非常缺乏。

对于领域testhttp://localhost:8080/ 上的给定Keycloak 安装,OAuth2 Authorization EndpointOAuth2 Token EndpointOpenID Connect UserInfo Endpoint 是什么?

我们对使用 Keycloak 自己的客户端库不感兴趣,我们希望使用标准的 OAuth2 / OpenID Connect 客户端库,因为使用 keycloak 服务器的客户端应用程序将使用多种语言(PHP、Ruby、Node、 Java、C#、角度)。因此,使用 Keycloak 客户端的示例对我们没有用处。

【问题讨论】:

  • 你最终改用了什么?
  • 我们终于能够说服楼上的,OAuth 作为应用程序本身使用的一种技术与登录和安全无关,仅与与第 3 方集成有关。很难解释这样一个事实,即到处使用它的 Google 和 FB 与我们无关。
  • @AmirAbiri 不会说它仅用于第 3 方集成。这是它现在的主要用途,但是,作为越来越多的互联网公司支持的协议,如果您在自己的企业环境中处理多个应用程序(或微服务)并且想要 SSO 解决方案,它也可能有意义。实际上,就我而言,我已经使用 keycloak 超过 10 个月了,我认为它可能也适用于简单的应用程序,因为它负责所有用户管理工作。

标签: keycloak


【解决方案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_tokenaccess_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

        【讨论】:

        【解决方案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 将设置所有其他身份提供者(如果他们支持并且已经处理)也适用

          【讨论】:

            猜你喜欢
            • 2017-02-09
            • 2019-07-28
            • 2020-07-23
            • 2015-10-09
            • 1970-01-01
            • 2020-02-08
            • 2018-04-17
            • 1970-01-01
            • 2017-04-18
            相关资源
            最近更新 更多