java - 在 Cloud SDK 中使用 XSTokenRequest 获取令牌
问题描述
我们使用 xs 安全库根据令牌类型(client_credentials/user_token)获取令牌。如果不使用 xs 安全库,我无法在 Cloud SDK 的安全功能中复制相同的内容。
背景:
- 我们希望根据令牌的类型使用服务凭证来完成令牌交换。
使用 xs 安全依赖项,我们使用以下代码使用客户端凭据获取技术令牌/用户令牌。
//For client token
public String getClientCredentialToken() {
JSONObject buslogUaaCred = envar.getBuslogCredentials().getJSONObject("uaa");
XSTokenRequest xsTokenRequest = null;
try {
xsTokenRequest = new XSTokenRequestImpl(buslogUaaCred.getString("url"));
} catch (URISyntaxException e) {
e.printStackTrace();
}
xsTokenRequest.setClientId(buslogUaaCred.getString("clientid"));
xsTokenRequest.setClientSecret(buslogUaaCred.getString("clientsecret"));
xsTokenRequest.setType(XSTokenRequest.TYPE_CLIENT_CREDENTIALS_TOKEN);
String token = SecurityContext.getUserInfo().requestToken(xsTokenRequest);
return token;
}
//For named user token
public String getNamedUserToken() {
JSONObject buslogUaaCred = envar.getBuslogCredentials().getJSONObject("uaa");
XSTokenRequest xsTokenRequest = null;
try {
xsTokenRequest = new XSTokenRequestImpl(buslogUaaCred.getString("url"));
} catch (URISyntaxException e) {
e.printStackTrace();
}
xsTokenRequest.setClientId(buslogUaaCred.getString("clientid"));
xsTokenRequest.setClientSecret(buslogUaaCred.getString("clientsecret"));
xsTokenRequest.setType(XSTokenRequest.TYPE_USER_TOKEN);
String token = SecurityContext.getUserInfo().requestToken(xsTokenRequest);
return token;
}
我已使用以下依赖项来试用云 SDK 的安全性。
<dependency>
<groupId>com.sap.cloud.s4hana.cloudplatform</groupId>
<artifactId>security</artifactId>
<version>2.18.1</version>
</dependency>
<dependency>
<groupId>com.sap.cloud.s4hana.cloudplatform</groupId>
<artifactId>security-scp-cf</artifactId>
<version>2.18.1</version>
</dependency>
我找不到任何方法来复制与上述相同的方法。
我只能找到一种基于绑定到应用程序的 xsuaa 实例来获取令牌的方法,如下所述:
// Get XSUAA service token.
public String getClientToken() {
return AuthTokenAccessor.getXsuaaServiceToken().getJwt().toString();
}
Cloud SDK 是否支持此功能?
解决方案
SAP Cloud SDK 根据底层目标类型(是否需要用户传播)透明地处理到 XSUAA 的相关 OAuth 流。
我们在 SDK 中有相关功能,但它没有公开公开,因为我们希望保留根据需要更改实现的自由。
我有点怀疑你是否真的需要并且想要自己做流程。相反,我建议使用 SDK 的 VDM(客户端库)或 DestinationAccessor、HttpClientAccessor 或 ScpCfService 类。不过,如果您有充分的理由自己执行流程,请像您已经使用的那样使用 XS 安全库。
出于好奇,你为什么要自己做流程?
(免责声明:我是 SAP Cloud SDK for Java 的作者之一)。
推荐阅读
- autodesk-forge - Forge 关卡扩展的切割平面在哪里?
- pandas - 如何根据索引合并两个数据框?
- swift - 当两个VC在同一个屏幕上时如何正确传递数据
- sql - Redshift - 将数字分成 10 个部分并找出数字属于哪个部分
- google-chrome-extension - 如何在网页中注入基于反应应用程序的 chrome 扩展?
- javascript - 如何在ajax响应javascript jquery中重新分配变量值
- python-3.x - 使用 tkinter 访问函数外的变量
- javascript - 如何跳过找到的值
- javascript - 我该如何检查输入信息是否包含在 user.json 文件中?
- java - ExtentPDFCucumberReporter 抛出 java.lang.ArithmeticException: / 零