在多线程应用程序中传递OAuth令牌



我们有一个基于Sap Cloud SDK(3.32.0(的SpringBoot应用程序,并在我们的预处理Sap环境中使用PrincipalPropertition。

我们的应用程序也在使用Axon框架(一个事件源框架(。这意味着我们对RestControllers的调用将作为命令发送到聚合,聚合反过来在事件总线上发送事件。通常,我们通过在事件消息上添加元数据来传递oauth令牌。这是由axon框架处理的。事件被分派到不同的线程上,然后是处理命令的线程。

然而,我们最近开始使用云sdk并生成OData V2客户端来向我们的预处理SAP实例发送/检索信息。SAP云SDK试图从ThreadContext中获取AuthToken,但是,由于Axon框架的异步性质,这无法正常工作。

是否有其他方式传递正确的令牌并跳过SDK的默认行为的方法?由于我们在事件元数据(可以由事件处理程序访问(中有为PrincipalPropertition进行用户令牌交换所需的令牌。

任何建议都很好!

Danny

您可以使用ThreadContextExecutor:方便地将线程上下文传播到新线程

ThreadContextExecutor executor = new ThreadContextExecutor();
Callable operationWithContext = () -> executor.execute(() -> operation());
invokeAsynchronously(operationWithContext);

查看有关该主题的文档。

是否有其他方式传递正确的令牌并跳过SDK的默认行为?

如果ThreadContextExecutor的解决方案不适合您,我们可以寻找一种解决方法:如果您正在寻找在子线程内传递访问令牌的方法,请使用以下代码示例:

import com.sap.cloud.sdk.cloudplatform.security.AuthTokenAccessor;
import com.sap.cloud.sdk.cloudplatform.security.AuthToken;
DecodedJWT jwt = JWT.decode("your-access-token");
AuthToken authToken = new AuthToken(jwt);
AuthTokenAccessor.executeWithAuthToken(authToken, () -> {
// do things..
});

请注意:除了当前的auth令牌,云SDK还可以从传递的JWT中提取主体和租户信息。

最新更新