我想对一个旧的Java (6)应用程序进行身份验证,该应用程序当前使用基于Keycloak OIDC Bearer的node-js进行安全保护(两个应用程序属于同一域)。
我被告知要使用keycloak-authz-client库解析以下keycloak OIDC JSON:
{
"realm": "xxx",
"realm-public-key": "fnzejhbfbhafbazhfzafazbfgeuizrgyez...",
"bearer-only": true,
"auth-server-url": "http://xxx:80/auth",
"ssl-required": "external",
"resource": "resourceName"
}
然而,keycloak Java客户端需要Java 8,而我的当前运行时是JRE6。重新编译包括传递依赖项的库似乎不是一个好主意,因此我最终使用了keycloak oauth2 REST端点。
据我所知,我会采用client_credentials流程,一次在应用程序初始化时交换客户端密钥以获得访问令牌,当其过期时刷新/更新。
来到Keycloak文档:
访问类型
这定义了OIDC客户端的类型。
机密
机密访问类型适用于需要执行浏览器登录并在将访问代码转换为访问令牌时需要客户端密钥的服务器端客户端(有关更多详细信息,请参见OAuth 2.0规范中的Access Token Request)。此类型应用于服务器端应用程序。
公共
公共访问类型适用于需要执行浏览器登录的客户端端客户端。对于客户端应用程序,没有办法保护机密安全。相反,重要的是通过为客户端配置正确的重定向URI来限制访问。
仅承载
Bearer-only访问类型意味着该应用程序仅允许bearer token请求。如果打开此选项,则该应用程序无法参与浏览器登录。
看起来 confidential
访问类型适合我的需求(应该用于服务器端应用程序),但我不明白它与浏览器登录有什么关系(在我看来,浏览器登录涉及使用第三方身份提供者如 Facebook 进行身份验证)。
confidential
客户端设置还需要一个有效的重定向uri,成功登录或退出后浏览器将重定向到该uri。作为要认证的客户端是一个应用程序,我不明白它的意义所在。
总体而言,我不明白整个访问类型的内容。它只与客户端相关还是与资源所有者也相关 (我的node.js应用程序是否被限制为仅使用 bearer-only 访问类型?它是否接受使用 client_credentials flow 获得的 access_token 进行 bearer 验证?我想这样做应该可以)。
有人能够澄清 keycloak OIDC 访问类型以及如果我做错了哪些地方吗?
使用 keycloak,将我的遗留应用程序的访问委托给其他应用程序的一些资源(不限于特定用户)的正确方法是什么?