使用Camel调用REST API,这需要对令牌发出单独的身份验证请求

7bsow1i6  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(191)

许多API需要单独调用身份验证服务器来检索用于发出主请求的令牌(有时是主主机)。有些API希望您为每个主请求发出此初步调用,但其他API希望您存储令牌并在一段时间内将其用于所有请求。
对于我的流程,我从队列中接收一个负载,需要将其转换为API请求。这一部分对于Camel来说很容易。但是对于第一种身份验证方法,即为每个主请求发出一个auth请求,我不知道如何在调用授权服务器后保留请求。
对于第二种身份验证方法,这里有一个保留令牌的示例:REST service call with Camel which requires authentication api called first
对于一个非常常见的集成场景来说,这看起来非常复杂。有没有更好的例子来说明如何用Came实现这两种方法?

agxfikkp

agxfikkp1#

我在想这样的事情(直观的解决方案,根本没有经过测试!)
诀窍是对auth服务器进行“In-Only”调用(以保留原始请求),并将获得的令牌放入一个属性中,以便(对API的)下一个调用可以使用它:

from("direct:demo")
    .to("direct:getAuthToken?exchangePattern=InOnly")
    .header("Authorization").simple("Bearer ${exchangeProperty.myToken}")
    .to("http://app-server/api/ws")
    .log("Response: ${body}")

from("direct:getAuthToken") 
    ...
    .to("http://iam-server/auth/realms/my-realm/protocol/openid-connect/token")
    .property("myToken").jsonpath("$.access_token")

当然,这可以通过高速缓存所获得的令牌来容易地优化,以避免对身份服务器的不必要的调用。
不确定它会起作用,但这可能会给予你一些启发。

njthzxwz

njthzxwz2#

我有类似的需求,但尚未实施解决方案。
为了不丢失原来的Exchange,enrich似乎是调用获取令牌的路由的更好方法。https://camel.apache.org/components/3.13.x/eips/enrich-eip.html

from("direct:demo")
    .enrich("direct:getAuthToken?exchangePattern=InOnly", aggregationStrategy)
    .header("Authorization").simple("Bearer ${exchangeProperty.myToken}")
    .to("http://app-server/api/ws")
    .log("Response: ${body}")

您还必须实现AggregationStrategy或使用预定义的策略。

相关问题