この記事は SAP Advent Calendar 2023 の 12 月 18 日分の記事として執筆しています。
はじめに
SAP SuccessFactors(以下 SF と略します) は、単体でも優れた人材管理ソリューションだとは思いますが、せっかく OData API が提供されているので、工夫次第で例えば
- BTP に必要なデータを抽出し、他のシステムの情報と混ぜ合わせて新たな価値を見出す
- SAC などの BI ツールにデータを提供することで、別の視点からデータを分析する
というようなことも出来るようになるでしょう。
そのための第一歩として、ローカル端末から SF の API を呼び出すところまでやってみます。
なお、この後実施する “SAML アサーションの生成” 方法は、非推奨となった /oauth/idp API を使わず、自身で生成する方法を取ります。
(当記事作成のモチベーションになった変更点です。ガッツリ使ってました)
ちなみに、今後の作業内容はすべて Help Portal に掲載されています。
最新情報や、より詳細な情報が必要な場合、そちらをご確認ください。
環境
- SAP SuccessFactors: b2311.20231204122616
- デモ環境を使います(この SF 環境調達が 1 番ハードルが高いかも)
- Windows11: 23H2
- Java: sapmachine-21.0.1
前提条件
- SF の Manage OAuth2 Client Applications にアクセスできる権限を持っていること
- SAP Note 3031657 にアクセスできること。この Note に添付されているツールを途中で使用します。
作業全体のシーケンス図
sequenceDiagram autonumber ローカル端末 ->> ローカル端末: 証明書作成 ローカル端末 ->> +SF: OAuth2 クライアントアプリケーション登録 SF ->> -ローカル端末: API Key 出力 ローカル端末 ->> ローカル端末: SAML アサーション生成 ローカル端末 ->> +SF: アクセストークン リクエスト SF ->> -ローカル端末: アクセストークン 返却 ローカル端末 ->> +SF: API 実行 SF ->> -ローカル端末: API 実行結果返却
作業詳細
事前準備 - OpenSSL を使用した X.509 証明書の作成
いきなりハードルが高いですが、SF の画面上で証明書を作成することも良しとはされていないため、頑張りましょう。
OpenSSL をインストール
とは言え、公式からソースファイルを落としてコンパイルしてー、だとただでさえ高いハードルがどこまでも高くなるので、別サイトで提供されているインストーラーを使わせてもらいます。
Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
開発を行うわけではないので、Light 版で OK
インストールはデフォルトでバシバシ進めれば OK。
ただし、path は通すようにしてください。
動作確認
> openssl version
OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2023)
CSR(Certificate Signing Request) を作成
openssl req -nodes -x509 -sha256 -newkey rsa:2048 -keyout private.pem -out public.pem
所有者情報は以下のように聞かれるため、最低 1 つは入力してください。
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
この記事通り実行した場合、以下ファイルが生成されます。
- private.pem
- public.pem
この時点の作業状況
sequenceDiagram autonumber ローカル端末 ->> ローカル端末: 証明書作成
OAuth2 クライアントアプリケーションの登録
Manage OAuth2 Client Applications にアクセス
Tools や 検索機能を使えば迷うこと無く開けるかと思います。
クライアントアプリケーション を登録
画像の通り、必要事項を入力します。
- Application Name: 登録するアプリケーションの名称。一意にする必要あり
- Description: 任意
- Bind to Users: 要件に応じて設定
- X.509 Certificate: 先の手順で作成した public.pem の内容を貼り付け - “BEGIN(END) CERTIFICATE” の行は不要
必要事項を入力し “Register” ボタンを押下すると、API Key が払い出されます。
この時点の作業状況
sequenceDiagram autonumber ローカル端末 ->> ローカル端末: 証明書作成 ローカル端末 ->> +SF: OAuth2 クライアントアプリケーション登録 SF ->> -ローカル端末: API Key 出力
SAML アサーション を作成する
先述の通り、 /oauth/idp API
を使うのではなく、自分で用意する方法を取ります。
本来は idP(Identify Provider) に発行してもらうものですが、ここでは SAP Note 3031657 に倣って、ツールを使って自前で生成します。
作業詳細は、上記 KBA に記載されているので割愛しますが、ハマるかもしれないところだけ抜粋して記載します。
SAMLAssertion.properties の各項目
Note に添付されている SAMLAssertionGen 内のプロパティファイル更新内容は以下の通りです。
- tokenUrl: /oauth/token API を指定します(API Server の探し方は後述)
- clientId: OAuth クライアントアプリケーション登録時に生成された API Key
- userId: SF ユーザー ID
- userName: (userId がブランクだった場合の) ユーザー名
- privateKey: 証明書作成時に生成した private.pem の中身(BEGIN(END) PRIVATE KEY の行は不要)
API Server を見つけるには
利用中の SF 環境に対応する API Server を List から探します。
例えば、デモ環境であれば以下のいずれかが対応する API Server となります。
あとは Data Center の数字などから API Server を見つけてください。
本記事を作成するにあたって使用した環境は “pmsalesdemo8” であるため、API Server は、“apisalesdemo8” かと思われます。
(この当て方で正しいのかわからないため、断言できません。すみません。)
アサーション生成ツールを実行
Maven のセットアップと、“SAMLAssertion.properties” の更新作業まで終わった後に、
mvn compile exec:java -Dexec.args="SAMLAssertion.properties"
## Powershell の場合は mvn compile exec:java `-Dexec.args="SAMLAssertion.properties"
と実行すると、SAML アサーションが出力されます。
(イメージ画像末尾)
この時点の作業状況
sequenceDiagram autonumber ローカル端末 ->> ローカル端末: 証明書作成 ローカル端末 ->> +SF: OAuth2 クライアントアプリケーション登録 SF ->> -ローカル端末: API Key 出力 ローカル端末 ->> ローカル端末: SAML アサーション生成
アクセストークンをリクエスト
ここまで取得・生成した情報でアクセストークンを取得します。API が実行出来るようになるまであとちょっと。
/oauth/token を呼び出してトークンを取得する
Postman などを使用して、トークン取得 API を呼び出します。
<API 情報>
URI https:// API Server /oauth/token
HTTP Method POST
Headers
Key | Value |
---|---|
Content-Type | application/x-www-form-urlencoded |
Request Body
Key | Value |
---|---|
company_id | SF の Company ID |
client_id | 先の手順で登録した、OAuth クライアントアプリケーション の API Key |
grant_type | 固定値 “urn:ietf:params:oauth:grant-type:saml2-bearer” |
assertion | 先の手順で作成した SAML アサーション |
正しい値で呼び出せた場合、access_token が取得できます。
この時点の作業状況
sequenceDiagram autonumber ローカル端末 ->> ローカル端末: 証明書作成 ローカル端末 ->> +SF: OAuth2 クライアントアプリケーション登録 SF ->> -ローカル端末: API Key 出力 ローカル端末 ->> ローカル端末: SAML アサーション生成 ローカル端末 ->> +SF: アクセストークン リクエスト SF ->> -ローカル端末: アクセストークン 返却
API を実行
ようやく、API を実行できるところまで進みました。
あとは SAP Business Accelerator Hub から、使用したい API を探しましょう。
ここでは ユーザー情報を取得 してみます。
<API 情報>
URI https:// API Server /odata/v2/User
HTTP Method GET
Headers なし
Authorization Bearer /oauth/token で取得したトークン
Query params 任意
適切に API を呼び出すことができれば、以下のようにユーザー情報を取得することが出来ます。
これにて、記事の最初に提示した作業工程全てが完了しました。
おわりに
記事にするとなかなかの長さになりますが、実際にやってみると案外すんなり進められますので、もし SF に携わる方で OAuth 2.0 や SAML に馴染みが無いなーという方はぜひやってみてください。
この記事ではローカル端末で証明書や SAML アサーションを作成していますので、そのままでは実運用に適用出来ない一方、認証ってどんな流れでなってるの?というのを理解するには自分でやってみるのが一番です。
最後になりますが、今年も SAP Advent Calendar を企画していただき、ありがとうございます。
1 年の最後に「何でもいいからとにかくブログ書こう」と思える場の提供、大変ありがたいです。