首页 > 解决方案 > 如何在 js webapp 中为仅承载后端客户端获取令牌

问题描述

我为我的应用程序设置了这个:

  1. 密钥斗篷服务器
  2. 受 Keycloak 保护的 nodejs 后端(仅承载)
  3. PHP/Reactjs 前端

前端是可选的登录保护。对于某些用户,需要登录,这会将用户重定向到 Keycloak 服务器。用户登录后,前端将拥有一个不记名令牌,用于对受 keycloak 保护的后端进行 api 调用。

我的问题是如何为不需要登录的用户(匿名用户)获取不记名令牌。

我尝试了这种方法:

  1. 创建了供 PHP 使用的“机密”客户端。
  2. 前端 PHP 使用 client_id 和 client_secret 获取不记名令牌并将它们传递给 javascript(我的意思是,在标签内打印出令牌值,这是一个全局变量)
  3. 最初,前端会成功调用 api,因为 php 传递的 access_token 是新鲜/有效的。
  4. 在 access_token 过期后,我需要使用 refresh_token 获取一个新的。
  5. 但是,为此我需要在 js 应用程序中不可用的 client_secret(如您所知,不建议在 js 应用程序中保存 client_secret 和密码)。

我被困在这里。我进行了研究,阅读了很多文档,但未能找到实现这一目标的方法。

我想到的另一个想法是让不记名 access_token 长寿命(例如 1 小时)。但是,有些用户可能会使用该应用程序超过一个小时。

在这一点上,我不确定是否可以从 javascript Web 应用程序匿名调用受 keycloak 保护的后端。

拥有很长的寿命(例如,6 小时)access_tokens 是错误的吗?我还有什么其他选择?

标签: oauth-2.0keycloakbearer-token

解决方案


我遇到过类似的情况。您可以使用以下方法。

  • 您的 API 始终受到访问令牌的保护
  • 最初,您的 PHP 后端使用Client Credentials Grant检索访问令牌
  • 加载 UI 后,您对 PHP 后端进行 JS 调用并获取相关的访问令牌。您将其存储到本地存储
  • 此调用受会话保护。最初是未经身份验证/匿名访问
  • 如果您需要具有不同范围的访问令牌(范围仅授予登录用户,非匿名情况),那么您让您的最终用户遵循登录过程以获取新令牌
  • 收到令牌后,您再次将它们存储在与后端和前端的会话中
  • UI 可以通过同一个后端调用获取到前端的访问令牌

这样,您就不会将访问令牌值硬编码到您的 UI 代码中。此外,后端调用受会话保护。

此外,

  • 刷新令牌存储在后端。所以存储和刷新是安全的
  • 客户端凭据永远不会暴露给前端

唯一的负担是与后端的会话维护。但是围绕此建立了许多最佳实践。!


推荐阅读