Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Fukuhara
Product and Topic Expert
Product and Topic Expert
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/e6fc90df44464a29952e1c2c36...
- xs-app.json (for help check https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/c103fb414988447ead2023f7680...
- mainfest.yml (for help check https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/ba527058dc4d423a9e0a69ecc67...

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