Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建一个自定义身份提供程序,并使用KeyClope对其进行配置_Java_Keycloak_Openid Connect_Idp - Fatal编程技术网

Java 创建一个自定义身份提供程序,并使用KeyClope对其进行配置

Java 创建一个自定义身份提供程序,并使用KeyClope对其进行配置,java,keycloak,openid-connect,idp,Java,Keycloak,Openid Connect,Idp,我正在从事一个项目,在这个项目中,我需要创建一个应用程序,在只支持OIDC进行身份验证的客户端和RESTAPI之间充当OIDC中介。RESTAPI能够生成令牌并提供用户信息,但不支持OIDC 为了实现这一点,我正在考虑使用keydove来处理与客户机的OIDC通信,并实现我自己的java应用程序,keydove可以触发该应用程序来实现授权、令牌和userinfo端点(某种自定义的自制身份提供者),以处理与RESTAPI的通信 我已经在keydove中创建了一个领域,并将该领域配置为使用身份提供程

我正在从事一个项目,在这个项目中,我需要创建一个应用程序,在只支持OIDC进行身份验证的客户端和RESTAPI之间充当OIDC中介。RESTAPI能够生成令牌并提供用户信息,但不支持OIDC

为了实现这一点,我正在考虑使用keydove来处理与客户机的OIDC通信,并实现我自己的java应用程序,keydove可以触发该应用程序来实现授权、令牌和userinfo端点(某种自定义的自制身份提供者),以处理与RESTAPI的通信

我已经在keydove中创建了一个领域,并将该领域配置为使用身份提供程序重定向器和我在keydove中添加的身份提供程序(用户定义的OpenID connectv1.0)。在identity provider配置中,我已将所有URL设置为指向我的java应用程序,但来自客户端的初始OIDC授权调用只是重定向到重定向uri,并带有一个#error=login_required,而java应用程序中的任何端点都不会被触发

我想我错过了一些东西。。我需要干预授权流,以便从需要在java应用程序中处理的授权请求中提取查询参数。我还需要将RESTAPI中的令牌映射到令牌请求中(当该请求来自客户端应用程序的后端时),最后将userinfo对象映射为对userinfo请求的响应

我真的希望有人有时间给我指出正确的方向。事先非常感谢你

编辑: 我添加了一个序列图来更好地解释它:

我需要截获授权请求调用以获取标识用户的自定义查询参数(endUserString)。没有用户登录表单。我需要在我的代码中使用这个参数来实现RESTAPI。令牌和用户信息必须从我的应用程序接收,而不是从KeyClope本身接收


Java中介可以提前请求令牌(a),并使用该令牌访问RESTAPI(使用预定义的clientId和clientsecret)。或者,可以为每个方法提取该令牌。To令牌必须用于从REST API(B)检索客户信息。我想在没有任何登录表单的情况下,用OIDC支持来包装它。浏览器将只重定向到授权流,并使用endUserString标识最终用户。客户信息将从java中介返回到keydape中,并在GetUserInfoRsp中对此做出响应

我认为可能有一个比您想象的更简单的解决方案:为KeyClope实现您自己的自定义验证器

Key斗篷有一个身份验证流的概念,它是由Key斗篷或定制的身份验证程序提供的身份验证程序树。可以调用每个验证器来尝试对用户进行身份验证

最常见的是用户名/密码表单,它向用户显示登录页面,并验证用户提供的凭据是否有效。但是您可以想象任何类型的验证器,例如

您可以找到和有关如何创建自己的文档

在您的情况下,您需要实现自己的逻辑,其中验证器将从请求中获取
endUserString
参数,并调用restapi来验证用户的身份。您可以在初始化时或为每个请求获取RESTAPI令牌。您还可以使用来自RESTAPI的用户信息端点(公共OIDC属性或自定义属性)的数据修改存储在keydape中的用户

请注意,开发团队宣布了一种重新启动项目的方式,这可能会给他们的API带来突破性的变化


此外,请考虑您的设计的所有安全影响,从您所提供的看来,用户的认证只依赖于一个简单的查询参数,如果它不随时间变化的话,感觉像是一个巨大的安全漏洞。

我在您的解决方案中遗漏了一点:为什么要使用KeyClope作为自制OIDC提供商/facade的代理?为什么不将客户端直接插入自制的OIDC提供商?嗨@Allan。我在想,也许keydape可以处理刷新令牌之类的东西,我只是在应用程序中公开了一些“helper”方法来执行对API的其余调用。或者我可能只是创建一些java代码,可以作为库添加到KeyClove中。也许您应该尝试添加有关RESTAPI、客户端和您预见的工作流的详细信息。如果有帮助的话,下面是keydape的测试用例,它们生成所需的
login\u
error:Hi。我更新了我的帖子,试图更好地解释事情。非常感谢你抽出时间。哇!那好多了,编辑做得很好!非常感谢你的投入。我将对此进行研究,看看是否能找到一种实现我自己的自定义验证器的方法。关于安全影响,我们完全了解,并做了一些风险分析。客户认为该解决方案足够安全,因为它不保护任何敏感数据。我们只需要让事情运转起来。从长远来看,我们正在计划更好的管理方法。再次感谢!你好,艾伦。我只是想再次感谢你的投入。我们在8月份启动并运行了一个解决方案。关于您警告的安全影响,我们为每个请求设置了不同的用户查询参数。我最终使用Magic link验证器作为模板来创建新的自定义验证器。通过将其添加到浏览器流中,我可以让KeyClope为我处理OIDC流,并且我能够从调用REST api的自定义身份验证程序中填充userinfo参数。很高兴它有帮助:)