通过领域中的组/角色来限制前端客户端的连接

时间:2020-07-09 12:56:23

标签: keycloak

我正在寻找一种方法来限制用户对领域中特定客户端的访问。 我知道我可以在启用了授权的客户端(细粒度的授权支持)上做到这一点,但是在尝试从前端进行连接时(客户端需要是公共的而不是机密的)它不起作用。 我正在使用JavaScript应用程序从前端登录。

有没有一种方法可以为公共客户或其他工作启用授权?

谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定这是否能完全回答您的问题,因为它仍然不是很具体,但可能会为您提供更多帮助。

如果您是该主题的新手,请在此处查看difference between public and confidential clients

对于诸如HTML / Javascipt应用程序之类的公共客户端,当前的最佳实践是将OpenId Connect与授权代码流+ PKCE 结合使用。 HTTPS当然是必须具备的。我建议您为此使用javascript openid连接适配器,例如:

https://github.com/panva/node-openid-client

基本上,您的身份验证/授权流程显示为here: 当用户要从您的前端客户端应用程序登录时,首先会生成一个唯一的验证程序,该验证程序仅对确切的用户/浏览器会话可用。将这个值作为代码挑战进行哈希处理。然后,用户将通过一些参数(例如重定向uri和质询)重定向到您的授权服务器(例如Keycloak)的登录页面。

成功登录后,用户将在keycloak服务器上获得一个会话,该会话还存储了哈希挑战。然后,将用户与代码一起重定向到给定的重定向uri(应用程序中的路径),以获取访问令牌。回到您的应用程序中,您的应用程序将原始值与代码一起使用以获取实际令牌。授权服务器根据存储的质询对值进行修正,并在匹配时获取访问令牌。您会看到额外的验证程序是为了防止任何人破坏您的代码片段以代表您获取令牌。

现在,您的浏览器应用中已有一个编码访问令牌。请注意,令牌本身通常仅经过编码而不加密,但可以对其进行签名。以后可以从您的后端使用这些签名来实现令牌完整性,但是我们很快就会解决。访问令牌中包含的角色,声明,范围等告诉您用户/身份的特权。当然,您可以使用它们来启用/禁用应用程序中的功能,阻止路由等。但是最终客户端保护永远不会真正有效,因此真正的授权和资源保护都发生在资源服务器上,即您的后端(节点,.net核心,java等)可能是一个宁静的Web Api。您会将访问令牌作为每个请求的一部分传递给http请求标头。现在,您的后端检查令牌完整性(可选)的到期时间等。分析范围,声明和角色以限制资源访问。

例如,简单的GET myapi / car / {1}可能仅需要令牌,甚至可能是匿名的,而POST myapi / cars或PUT myapi / car / {1}可能需要特殊角色或更高的特权。 / p>

这对您有帮助吗?