Oauth 2.0 如何在js webapp中为仅承载后端客户端获取令牌

Oauth 2.0 如何在js webapp中为仅承载后端客户端获取令牌,oauth-2.0,keycloak,bearer-token,Oauth 2.0,Keycloak,Bearer Token,我为我的应用程序获得了以下设置: 密钥斗篷服务器 密钥斗篷保护的nodejs后端(仅承载) PHP/js前端 前端可以选择进行登录保护。对于某些用户,需要登录,这会将用户重定向到KeyClope服务器。用户登录后,前端将拥有一个承载令牌,用于对受KeyClope保护的后端进行api调用 我的问题是如何为不需要登录的用户(匿名用户)获取承载令牌 我尝试过这种方法: 创建供PHP使用的“机密”客户端 前端PHP使用client_id和client_secret获取一个承载令牌,并将它们传递给java

我为我的应用程序获得了以下设置:

  • 密钥斗篷服务器
  • 密钥斗篷保护的nodejs后端(仅承载)
  • PHP/js前端
  • 前端可以选择进行登录保护。对于某些用户,需要登录,这会将用户重定向到KeyClope服务器。用户登录后,前端将拥有一个承载令牌,用于对受KeyClope保护的后端进行api调用

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

    我尝试过这种方法:

  • 创建供PHP使用的“机密”客户端
  • 前端PHP使用client_id和client_secret获取一个承载令牌,并将它们传递给javascript(我的意思是,在作为全局变量的标记中打印出令牌值)
  • 最初,前端进行成功的api调用,因为php传递的access_令牌是新的/有效的
  • 访问令牌过期后,我需要使用刷新令牌获取一个新令牌
  • 但是,为此,我需要js应用程序中不可用的客户端密码(如您所知,不建议在js应用程序中保存客户端密码)
  • 我被困在这里了。我进行了研究,阅读了大量文档,但没有找到实现这一点的方法

    我脑海中闪过的另一个想法是让持票人访问令牌长寿(例如,1小时)。但是,一些用户可能会使用该应用程序超过一个小时

    在这一点上,我不确定是否有可能从JavaScriptWeb应用程序匿名调用KeyClope保护的后端


    使用寿命很长(例如,6小时)的访问令牌是否错误?我还有什么其他选择?

    在不增加很多复杂性的情况下,当访问令牌过期(用户未经授权的请求)时,重定向用户以重新登录。这要容易得多,因为在许多场景中都是相同的流程


    另一种选择是使用会话之类的东西来处理这个问题,这确实增加了复杂性

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

    • 您的API始终受到访问令牌的保护
    • 最初,您的PHP后端使用
    • 加载UI后,对PHP后端进行JS调用并获取相关的访问令牌。您可以将其存储到本地存储
    • 此呼叫受会话保护。最初是未经验证/匿名访问
    • 如果您需要具有不同作用域的访问令牌(仅授予登录用户的作用域,非匿名情况),那么您可以让最终用户按照登录过程获取新令牌
    • 一旦收到令牌,您将再次根据与后端和前端的会话存储它们
    • UI可以通过相同的后端调用获取前端的访问令牌
    这样,您就不会硬编码访问UI代码中的令牌值。此外,后端调用受会话保护

    另外,

    • 刷新令牌存储在后端。因此,存储和刷新是安全的
    • 客户端凭据从不向前端公开

    唯一的负担是后端的会话维护。但是有许多最佳实践都是围绕这一点建立起来的

    我的问题是匿名访问。有些访问者可能没有注册,但他们仍然可以使用我们的应用程序。注册用户可以在访问令牌过期时更新访问令牌;没有问题。酷,在这种情况下,肯定会按照第一个发送到登录页面。当客户端没有凭据或需要重新请求凭据时,向客户端发送401,然后通过导航到登录来处理客户端上的代码。