SAP Cloud SDKを使った開発

この記事は [chillSAP 夏の自由研究2022](https://note.com/chillsap/n/n62740563aee0) 8/8の記事として執筆しています

# はじめに
SAP BTP上でUI5のApplicationを作成時、DBへの登録処理等でサーバサイドのアプリケーションの開発も必要になることが多いかと思います。特にJavaのアプリケーションを開発する際に便利なSAP Cloud SDK等、Javaのライブラリについて一部紹介させていただきます。


# ログインユーザの情報を取得
IAS(Identity Authentication Service) でユーザ管理をし、IAS上で管理されているユーザID、メールアドレス、従業員番号等を
サーバサイドのJavaアプリケーションで取得する場合に、com.sap.cloud.security.xsuaaのライブラリを使用し、Tokenから情報を取得することができます。

#### pom.xmlへの記載例

```
<dependency>
    <groupId>com.sap.cloud.security.xsuaa</groupId>
    <artifactId>xsuaa-spring-boot-starter</artifactId>
    <version>2.13.0</version>
</dependency>
```

で対象のライブラリを読み込むことで使用が可能

WebSecurityConfigurerAdapterを拡張したクラスを作成し、xs-security.jsonと合わせてAPI単位に権限を設定することも可能

#### WebSecurityConfigurerAdapterの拡張例

```
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
    @Autowired
    XsuaaServiceConfiguration xsuaaServiceConfiguration;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .authorizeRequests()
            .antMatchers("/hello-token/**").hasAuthority("Read") // checks whether it has scope "<xsappId>.Read"
            .antMatchers("/actuator/**").authenticated()
            .anyRequest().denyAll()
        .and()
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(getJwtAuthoritiesConverter());
        // @formatter:on
    }

    Converter<Jwt, AbstractAuthenticationToken> getJwtAuthoritiesConverter() {
        TokenAuthenticationConverter converter = new TokenAuthenticationConverter(xsuaaServiceConfiguration);
        converter.setLocalScopeAsAuthorities(true); // not applicable in case of multiple xsuaa bindings!
        return converter;
    }

}

```


従業員番号等、拡張属性については
* IASの設定画面でSAML Assertion Attributesで追加
* xs-security.jsonにattributesの追加 
* SAP BTPのApplicationのSecurity設定にAttributesを追加

の手順を踏むことにより、Javaのアプリケーションで拡張属性を取得することができます。
※Tokenからメールアドレス等の取得メソッドは用意されていますが、拡張属性は
getXSUserAttributeで取得の必要があります。

### Tokenより取得例

```
@GetMapping("/v1/api/UserInfo")
    public ResponseEntity<UserInfo> responseEntity(@AuthenticationPrincipal Token token) throws TokenFlowException {
                
       UserInfo res = new UserInfo();
        res.setLogonName(token.getLogonName());
        res.setGivenName(token.getGivenName());
        res.setFamilyName(token.getFamilyName());
        res.setEmail(token.getEmail());
        res.setOrigin(token.getOrigin());
        String[] employeeNumber = token.getXSUserAttribute("EmployeeNum");
        return new ResponseEntity<>(res, HttpStatus.OK);
    }

```


参考サイト
https://github.com/SAP/cloud-security-xsuaa-integration
https://qiita.com/tami/items/77f8cad68cfd6975c9c0
https://blogs.sap.com/2020/07/24/mapping-of-saml-attributes-with-xsuaa-jwt-in-cloud-foundry/


# javaからdestinationに設定したURLへの呼び出し

UI5等のフロント側からdestinationに設定したoDataサービス等を呼び出すことは多いので、サンプルコード等は良く目にしますが、今回はサーバサイドのアプリケーションからdestinationに設定したoDataサービス等を呼び出す方法を紹介します。
事例として、SuccessFactorsに保持したデータをバッチ処理でHANA DBへインポート処理や、バックエンドでFormsByAdobeを用いたPDF生成に使いました。


### 利点
* 認証設定のID/PWをJavaの設定に保持する必要がなくなる
* 認証処理をdestinationに任せることができる
* SAP SuccessFactors Extensibility作成時に自動的に作成されたdestinationを使用可能


#### pom.xmlへの記載例

```
    <dependency>
        <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
        <artifactId>scp-cf</artifactId>
        <version>3.40.0</version>
    </dependency>
```

#### Javaのコード例

```
DestinationLoader destinationLoader = new ScpCfDestinationLoader(Duration.ofSeconds(10));
HttpDestination destination = destinationLoader.tryGetDestination("hoge").get().asHttp(); 
HttpGet getRequest = new HttpGet(destination.getUri().toString() + "v1/forms/" + formTemplate);
HttpResponse httpResponse = httpClient.execute(getRequest);
        
```


# その他
その他にもAlertNotificationServiceへ簡単にアクセスするライブラリや、Application Logging Serviceで表示されるLogViewerのlevelやlogger、msg等もきれいに出すためのライブラリも存在します。
他にも、SAP Cloud SDKの中には多くの機能が存在します。要件に直接必要な機能でないかもしれませんが、UATを始めとするテストフェーズでこれらのライブラリを導入することにより、不具合のトレースがしやすくなります。

# 終わりに
今回はchillSAP 夏の自由研究2022ということでライブラリの紹介を載せましたが、使い方の詳細などはまた詳しく投稿していきたいと思います。


参考サイト
https://sap.github.io/cloud-sdk/docs/overview/getting-started