首页 > 解决方案 > 在 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 是否支持此功能?

标签: javatokens4sdksap-cloud-sdk

解决方案


SAP Cloud SDK 根据底层目标类型(是否需要用户传播)透明地处理到 XSUAA 的相关 OAuth 流。

我们在 SDK 中有相关功能,但它没有公开公开,因为我们希望保留根据需要更改实现的自由。

我有点怀疑你是否真的需要并且想要自己做流程。相反,我建议使用 SDK 的 VDM(客户端库)或 DestinationAccessor、HttpClientAccessor 或 ScpCfService 类。不过,如果您有充分的理由自己执行流程,请像您已经使用的那样使用 XS 安全库。

出于好奇,你为什么要自己做流程?

(免责声明:我是 SAP Cloud SDK for Java 的作者之一)。


推荐阅读