Technical Articles
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のエンコード)のが面倒だったので試していません。