Skip to Content
Technical Articles
Author's profile photo Yohei Fukuhara

BASIC認証ありのJava ApplicationをSAP Cloud SDK for Javaで作成

App RouterにXSUAAでBASIC認証を設定する方法です。App Routerの裏にあるJava Appに直接アクセスできなくさせるようにしたかったのですが、時間がなくそこまで調べませんでした。

チュートリアル「Build a Chatbot with SAP Conversational AI and SAP HANA XS Advanced Model」を参考にしています。

開発環境

開発環境はJavaとNode.jsで分けています。既存のJava開発環境がWindowsにあったため継続して使っているだけで、深い理由はないです。

Java開発環境(Windows)

Javaは以下の環境で実行しています。

  • OS: Windows10 64-bit
  • openJDK: 1.8.0_252
  • Chocolatey: 0.10.15
  • maven: 3.6.3
  • IDE: IntelliJ IDEA Community Edition 2019.3.3
  • CF cli: 6.51.0+2acd15650.2020-04-07
  • SAP Cloud SDK for Java: 3.20.0

Node.JS開発環境(Ubuntu)

Node.jsは以下の環境で実行しています。

  • OS: Ubuntu18.04.01 LTS
  • nvm: 0.35.3
  • Node.js: 12.16.2
  • npm: 6.14.4
  • SAP Cloud SDK for JavaScript:1.19.0
  • SAP Cloud SDK cli: 0.1.8
  • nest cli: 7.1.2
  • CF cli: 6.51.0+2acd15650.2020-04-07

手順

1. Route作成

Ubuntu環境で実行しています(CFにはログイン済)。

App RouterおよびJava RET API用のRouteを2つ作成します。

cf create-route <space name> cfapps.eu10.hana.ondemand.com --hostname <host name of App Router>
cf create-route <space name> cfapps.eu10.hana.ondemand.com --hostname <host name of Java App>

2. Java Application作成

Windows環境で実行しています(CFにはログイン済)。

プロジェクトを置くディレクトリで以下のコマンドでプロジェクト作成(コマンド実行でフォルダが生成されます)。

mvn archetype:generate "-DarchetypeGroupId=com.sap.cloud.sdk.archetypes" "-DarchetypeArtifactId=scp-cf-tomee" "-DarchetypeVersion=RELEASE"

途中のプロンプトでは以下を入力。”artifactId”に入力した”rest-java”がApplication名です。

  • groupId: com.sap.cloud.sdk
  • artifactId: rest-java
  • version: 1.0-SNAPSHOT
  • package: com.sap.cloud.sdk

なぜかこの状態でパッケージ生成をしようとするとエラーが起きます。”application/pom.xml”の以下の部分(versionタグの値)を変更します。メインのパッケージと同じバージョン3.20.0ではなく、3.18.0にしています。ついでに用途分析もしたくなかったので”skipUsageAnalytics”タグもfalseからtrueにしています。

            <plugin>
                <groupId>com.sap.cloud.sdk.plugins</groupId>
                <artifactId>usage-analytics-maven-plugin</artifactId>
                <version>3.18.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>usage-analytics</goal>
                        </goals>
                        <configuration>
                            <skipUsageAnalytics>true</skipUsageAnalytics>
                            <generateSalt>true</generateSalt>
                            <!--
                            Note: A random salt is auto-generated once the project is built for the first time.
                            Please keep the generated salt in the POM file, for example, when pushing to git.

                            To learn more, visit: https://blogs.sap.com/2018/10/23/usage-analytics-s4sdk/
                            -->
                            <salt />
                        </configuration>
                    </execution>
                </executions>
            </plugin>

カレントディレクトリをプロジェクトルートに移動してパッケージ生成。

# プロジェクトルートディレクトリから
mvn clean package

ルートディレクトリの”manifest.yml”を変更。ramdom-routeをfalseにして、routesに前ステップで作成したrouteを割当。

---
applications:

- name: rest-java
  memory: 1024M
  timeout: 300
  random-route: false
  routes:
    - route:
        https://<1で登録したRoute> 
  path: application/target/rest-java-application.war
  buildpacks:
    - sap_java_buildpack
  env:
    TARGET_RUNTIME: tomee7
    SET_LOGGING_LEVEL: '{ROOT: INFO, com.sap.cloud.sdk: INFO}'
    JBP_CONFIG_SAPJVM_MEMORY_SIZES: 'metaspace:128m..'
#  services:
#  - my-application-logs
#  - my-xsuaa
#  - my-destination
#  - my-connectivity

カレントディレクトリをルートに移動してCFへデプロイします。

# プロジェクトルートディレクトリから
cf push

3. App RouterとXSUAA作成

Ubuntu環境で実行しています(CFにはログイン済)。

3.1. SAP Cloud SDK for Javascript cli実行

SAP Cloud SDK for Javascriptのcliを使ってApp Routerを作成します。

作成したいディレクトリに移動して以下のコマンド実行。途中のプロンプトではJava Applicationの名前”rest-java”を入力。

> sap-cloud-sdk add-approuter
No 'manifest.yml' found.
Enter project name as maintained in Cloud Foundry: rest-java
  ✔ Creating files
✅ Successfully added approuter to your project.

Generated files might need customization. Documentation available here:
- xs-security.json (for help check https://help.sap.com/viewer/4505d0bdaf4948449b7f7379d24d0f0d/2.0.02/en-US/e6fc90df44464a29952e1c2c36dd9861.html)
- xs-app.json (for help check https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/c103fb414988447ead2023f768096dcc.html)
- mainfest.yml (for help check https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/ba527058dc4d423a9e0a69ecc67f4593.html)

3.2. XSUAAサービス作成

作成された”xs-security.json”を変更

{
  "xsappname": "rest-java",
  "tenant-mode": "dedicated"
}

XSUAAサービスを作成します。

cf create-service xsuaa application my-xsuaa -c xs-security.json

XSUAAサービスをJavaにbindしてJava Applicationをrestageします。

cf bind-service rest-java my-xsuaa
cf restage rest-java

3.3. App Router作成

xs-app.jsonを変更。”authenticationType”をbasicにします。

{
  "welcomeFile": "index.html",
  "routes": [{
    "source": "/",
    "target": "/",
    "destination": "rest-java",
    "authenticationType": "basic"
  }]
}

“manifest.yml”を変更。

applications:
  - name: router-basic
    routes:
      - route: >-
          https://<1で登録したApp RouterのRoute>
    path: .
    memory: 128M
    buildpacks:
      - nodejs_buildpack
    env:
#      TENANT_HOST_PATTERN: >-
#        "rest-java-(.*).cfapps.sap.hana.ondemand.com"
      destinations: >-
        [{"name":"rest-java","url":"https://<1で登録したJava AppのRoute>","forwardAuthToken":true}]
    services:
      - my-xsuaa

App RouterをCFへデプロイします。

cf push

この状態でApp RouterにブラウザでアクセスするとBASIC認証情報を聞かれます。ただし、Java ApplicationにApp Routerなしで直接アクセスもできます。

Curlでやろうとしましたがヘッダの認証情報を作る(BASE64のエンコード)のが面倒だったので試していません。

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.