【问题标题】:OpenID Connect - Token Validation on client without call identity provider (IdP)OpenID Connect - 在没有呼叫身份提供者 (IdP) 的客户端上进行令牌验证
【发布时间】:2021-11-03 08:56:27
【问题描述】:

我正在寻找一种无需调用 IdP 即可验证 ID 令牌的方法。客户端应用程序和 IdP 在受控环境中运行。出于这个原因,我想直接在我的中间件中验证 Keycloak 提供的来自 OIDC 的访问令牌。出于性能原因,我不想再次从 Keycloak 调用 OIDC 端点来验证现有的 id/访问令牌。

这可能吗? 中间件需要什么信息?

PS 我正在寻找一个 PHP 实现 :)

【问题讨论】:

    标签: php keycloak openid-connect middleware


    【解决方案1】:

    如果您可以在客户端中包含公共签名密钥,那么您可以离线验证所有令牌。有很多 JWT 令牌库可以为您做到这一点。

    最常见的情况是客户端下载了公钥,但没有什么能阻止您将它包含在客户端中。请注意,如果您更新 Keycloak 中的密钥,您也会更新客户端密钥。

    为了识别用户,通常使用经典会话 cookie。在用户登录后,使用 cookie 是一种经过验证且安全的方式来识别用户。假设您以正确的方式保护 cookie。 (同站点,安全,httponly)

    这是一个关于该主题的好视频:

    【讨论】:

    • 这一切都取决于客户端是您的后端 PHP Web 应用程序还是您使用 SPA (React/Angular) 应用程序。通常,您只在浏览器中存储会话 cookie 并将令牌保留在后端。如果可以避免,则不应将令牌保留在浏览器中。 IT 通常是进行验证的令牌的接收者。 ID 令牌在客户端中得到验证,然后客户端发出会话 cookie。访问令牌主要由它的接收者(API)签入。
    • 另请参阅我在答案中添加的链接。
    • 如果我这样做并使用来自 OIDC 的身份验证授权流。浏览器中存储了什么?在调用我的客户端应用程序时,我被重定向到 IdP,在那里我登录并使用“代码”重定向,客户端(我的应用程序)可以使用它来获取 ID 令牌和刷新令牌。但是,如果我的用户(浏览器)已登录,如果用户中没有存储令牌,我该如何验证令牌?在这里,我不了解 OIDC 流程。浏览器中究竟存储了什么来用我的客户端中的 id 令牌来识别他?我的客户端应用程序是否需要存储 id 令牌?当用户再次调用我的应用时,我的应用如何识别同一用户?
    • 一些系统(如 ASP.NET 核心)将接收到的令牌(Access/ID/Refresh)存储在会话 cookie 中加密。是的,cookie 变得非常大,但这是存储它们的最简单方法。由于它是加密的,没有人(甚至是浏览器)无法解密它。
    • 令牌的存储方式和存储位置完全取决于具体的实现。我不认为标准处理这个问题。我认为一个起点是将它们放入 cookie 中,如果它变大(请验证 cookie 大小),然后您可以查看将令牌存储在后端(数据库/内存中/Redis ...)
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2017-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2020-11-20
    • 2020-02-05
    • 2016-04-18
    相关资源
    最近更新 更多