はじめに
前回取り上げたSW360ですが、自動化のためのREST APIが準備されています。SW360のインスタンスにはREST APIのガイドも用意されていますが、本体のバージョンアップに追い付いていないため、そのままでは実行できません。
今回は、実際にSW360のREST APIを利用についてご紹介します。
この記事でお伝えしたいこと
SW360(sw360-15.0.0-M1)のREST APIを利用するための準備と、コンポーネントやプロジェクトの情報取得や設定を行うまでを解説します。
以下のような方が読まれることを想定しています。
- SW360のREST APIを試してみたい方。
また、以下の知識を必要とします。
- Linuxに関する知識。
- REST APIに関する知識。
- curlに関する知識。
解説の流れ
SW360でREST APIを利用するには次の流れになります。
-
クライアントの登録
client_id/client-secretの取得
クライアントの削除
-
認証トークンの取得
Login情報による取得
-
REST API呼び出し
環境
検証環境
本記事では以下のような環境を想定して説明を行います。処理の実行については、基本的にSW360サーバー上で実行します。
SW360サーバー
-
OS
Ubuntu 20.04 LTS
-
SW360バージョン
sw360-15.0.0-M1
-
SW360アカウント情報
UserID: admin@sw360.org
Password: 12345
-
クライアントツール
curl
jq
準備
クライアントの登録
REST API利用するにあたり、アクセス可能なクライアントを登録し、IDとSecretを取得する必要があります。
GUIを利用する方法と、コマンドにて登録する方法があります。Tokenのタイムアウトは3600秒、READ/WRITE権限で登録します。
GUIでの登録
-
管理者権限を持つユーザーでログインします。
-
SW360のメニュー Admin > OAuth Clientを選択します。
-
別ウインドウでクライアント管理ページ(http://localhost/authorization/client-management)が開きます。認証画面(通常はBasic認証ダイアログ)が開くので、管理者権限を持つユーザーでログインします。
-
OAuth Client ページに戻り、Create new client ボタンでダイアログを開きます。情報を入力して Create ボタンを押してクライアントを作成します。
-
作成されたクライアントが、 OAuth Client ページに表示されます。client_id および client_secret が参照できます。
ポップアップブロックなどでクライアント管理ページが開かなかったり、ログイン失敗した場合、OAuth Clientページにボタンなどが表示されません。一度ログアウトしてから、再実行してください。
コマンドでの登録
curlコマンドを用いてWebAPIを経由して登録します。
[コマンド例]
SW360_USER=admin@sw360.org # SW360のシステム管理権限を持つユーザー
SW360_PW=12345 # ユーザーのログインパスワード
SW360_HOST=http://localhost # SW360サーバー
curl -s -S ¥
--user "${SW360_USER}:${SW360_PW}" ¥
-H "Content-Type: application/json" ¥
-H "Accept: application/json" ¥
-X POST ${SW360_HOST}/authorization/client-management ¥
-d '{
"description" : "REST API client",
"authorities" : [ "BASIC" ],
"scope" : [ "READ", "WRITE" ],
"access_token_validity" : 3600,
"refresh_token_validity" : 3600
}'
SSOで認証を行う場合には、curlコマンドで実施することはできません。
公式のHPを参照して、ブラウザーから実施してください。
実行すると、次のようにID/Secretが取得できます。
{
"description" : "REST API client",
"client_id" : "93079a408d6dff0691be044f4c0018ad",
"client_secret" : "53568c3c-35b8-4451-adb8-c075e4f03a21",
"authorities" : [ "BASIC" ],
"scope" : [ "READ", "WRITE" ],
"access_token_validity" : 3600, "refresh_token_validity" : 3600
}
この作業は一度実施すれば、次回以降同じ情報を利用できます。登録した情報は、 OAuth Client ページまたは http://localhost/authorization/client-management にて参照可能です。
クライアントの削除
不要になったクライアントは OAuth Client ページにて削除できます。以下のように、curlコマンドを用いてWebAPIを経由して削除することもできます。
[コマンド例]
SW360_USER=admin@sw360.org # SW360のシステム管理権限を持つユーザー
SW360_PW=12345 # ユーザーのログインパスワード
SW360_HOST=http://localhost # SW360サーバー
CLIENT_ID=93079a408d6dff0691be044f4c0018ad # クライアントの登録で取得した client_id
curl -s -S ¥
--user "${SW360_USER}:${SW360_PW}" ¥
--header "Content-Type: application/json" ¥
--header "Accept: application/json" ¥
-X DELETE ${SW360_HOST}/authorization/client-management/${CLIENT_ID}
認証トークンの取得
API実行に利用するBearerTokenを取得します。
Login情報による取得
ユーザーのログインIDとパスワードで認証を行います。
[コマンド例]
SW360_USER=admin@sw360.org # SW360のシステム管理権限を持つユーザー
SW360_PW=12345 # ユーザーのログインパスワード
SW360_HOST=http://localhost # SW360サーバー
CLIENT_ID=93079a408d6dff0691be044f4c0018ad # クライアントの登録で取得した client_id
CLIENT_SECRET=53568c3c-35b8-4451-adb8-c075e4f03a21 # クライアントの登録で取得した client_secret
curl -s -S ¥
--user "${CLIENT_ID}:${CLIENT_SECRET}" ¥
-d "grant_type=password&username=${SW360_USER}&password=${SW360_PW}" ¥
-X POST ${SW360_HOST}/authorization/oauth/token -k
認証が成功すると、以下のような結果が取得できます。
{
"access_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl
9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCIsIldSSVRFIl0sImV4cCI6MTY1NTM2NDIwNS
wiYXV0aG9yaXRpZXMiOlsiUkVBRCIsIldSSVRFIl0sImp0aSI6Ijk4YTc3NGRjLTVhYTUtNDUyZC04N2ZkLTBk
Y2U1YWJkZDljYSIsImNsaWVudF9pZCI6IjkzMDc5YTQwOGQ2ZGZmMDY5MWJlMDQ0ZjRjMDAxOGFkIn0.Aqfu72tPoINmD1d8_
CUcDGX_jC5IkKDaz1Kxw_m18i2Nrt6X9U-OiQthDC0MXRRxrnHveb-lME9yE8uVQT6bdinalQKKpmc5qUT_sxyKG-gXvi
Cm0lNbxhSX1OmiffV4e-Fy_QOEfRDZrWYxLHNwwNRReqvDwor339Q56eexXr3-3CNrEjCvjZnL5Ig7_wMpIrfi0eEEm
dm7DAVxQ1WDvlCu6wnD75PkfJ-Zol-4PkhTc7sqyEScJELiAREv0475ze3wdLQ_6zSZOGsyKfENMZDB6k85QdRxDpRMM3Q9365
laMcJAVFwZ7d1jv0IAe2AsM4SqYKBPyFcgk0yZVpfOA",
"token_type" : "bearer",
"refresh_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1B
UEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCIsIldSSVRFIl0sImF0aSI6Ijk4YTc3NG
RjLTVhYTUtNDUyZC04N2ZkLTBkY2U1YWJkZDljYSIsImV4cCI6MTY1NTM2NDIwNSwiYXV0aG9yaXRpZXMiOlsiUkVBRCIsIldS
SVRFIl0sImp0aSI6IjQ0OWQzNWY5LTFiMzMtNDVhZC1iMDM4LTA0ZDM1MWUyNWU4OSIsImNsaWVudF9pZCI6IjkzMDc5YTQ
wOGQ2ZGZmMDY5MWJlMDQ0ZjRjMDAxOGFkIn0.WoGWuKB2qT
Z02kwNaZO_wUv7mfGd-yrHhvRmD3YsP2AuZ-vzIPm1vGDNH4VifN3crjd0GwBGTlQj4FLMiN0
2-fcOl7FM06vINmdJy5y3UTuESiqa9-Ks3GhfJPN7UEDJ_mNNJ4-U9nAmF1XM_f4oDfALOe_WtsVKuUEcQxO
hmrsFeuQiXWbgJNgfYd3Jv3ofuxqMBaQwxhpkKbFWeyhfU7eRJHawnmiPUxa2Ej3v2nwtZL868I7jzSJj5LdTs
GMV3XUwamB8qYynLSda3R3a63xDVLvSWYHqKgdLFN4kK7UqRi_PMg5RgbQHIghyPEORNzuW15pVGcYPdKiC-oXIqw",
"expires_in" : 3599,
"scope" : "READ WRITE", "jti" : "98a774dc-5aa5-452d-87fd-0dce5abdd9ca"
}
Bashなどで利用する場合、以下のように変数へ格納するのも良いでしょう。
[コマンド例]
BEARER_TOKEN=$(curl -s -S ¥
--user "${CLIENT_ID}:${CLIENT_SECRET}" ¥
-d "grant_type=password&username=${SW360_USER}&password=${SW360_PW}" ¥
-X POST ${SW360_HOST}/authorization/oauth/token | jq -r .access_token)
REST APIの実行
基本のAPI呼び出し
API情報はインスタンスの /resource/docs/api-guide.html にあります。
ただし、sw360-15.0.0-M1に関しては、ガイドに記載されているREST APIのURL ホスト名/api/~ をホスト名/resource/api/~ と読み替えてください。
基本の呼び出し例として、プロジェクトの一覧を取得します。
[コマンド例]
SW360_HOST=http://localhost # SW360サーバー
BEARER_TOKEN=eyJhbGciOiJSUzI1Ni(省略) # 認証で取得した access_token
curl -s -S -X GET ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/projects"
以降の説明では、 SW360_HOST および BEARER_TOKEN の設定に関しては記述を省略します。内容は上記を参照してください。
参照系APIの例
参照のAPI例です。複数の結果が返る参照系APIには、ソートやページネーション、フィルタなどのオプションがあります。
コンポーネント一覧:名前降順ソート、ページネーションあり(項目数100、先頭ページ指定)
[コマンド例]
curl -s -S -X GET ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/components?page=0&page_entries=100&sort=name%2Cdesc"
コンポーネント一覧:名前("Commons IO")フィルタあり
[コマンド例]
curl -s -S -X GET ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/components?name=Commons%20IO"
設定系APIの例
設定のAPI例です。追加はPOST、更新はPATCHメソッドで実行します。ボディにJSON形式で登録情報を指定してください(必須項外の項目は省略も可能です)。また、ヘッダーに"Content-Type: application/json"を設定することを忘れないようにしてください。
コンポーネント追加
[コマンド例]
curl -s -S -X POST ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Content-Type: application/json" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/components" ¥
-d '{
"componentType" : "OSS",
"name" : "ApiSample",
"description" : "ApiSample is REST API Sample"
}'
bashの変数に格納した情報を利用して更新することもできます。また、日本語の文字列も可能です。その場合は文字コードに注意してください。
コンポーネント更新
[コマンド例]
EXTERNAL_ID=3fc7d483-6bfc-4acc-a8ff-4882d2dc9ac4 # external_id
COMPONENT_ID=b1a66ee4f13e47938825f01c686b315e # component_id
curl -s -S -X PATCH ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Content-Type: application/json" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/components/${COMPONENT_ID}" ¥
-d @- <<EOF
{
"externalIds" : {
"bd-component-id" : "${EXTERNAL_ID}"
},
"componentType" : "OSS",
"description" : "サンプルコンポーネントです"
}
EOF
コンポーネントを指定するcomponent_idは、コンポーネント追加の戻り値や、コンポーネント一覧の結果などから取得してください。
REST APIの注意
APIガイドの情報に関し、必要なリクエストパラメータなどが不明なケースなどがあります。実行結果のレスポンスを参考にすることもできますが、以下のリリース更新のライセンス指定などは、まったく異なるので注意が必要です。
リリース更新
[コマンド例]
RELEASE_ID=99fa97a98a6f44b9a755a026cdf47847 # release_id
curl -s -S -X PATCH ¥
-H "Authorization: Bearer ${BEARER_TOKEN}" ¥
-H "Content-Type: application/json" ¥
-H "Accept: application/hal+json" ¥
"${SW360_HOST}/resource/api/releases/${RELEASE_ID}" ¥
-d '{
"mainLicenseIds": ["Apache-2.0"]
}'
メインのライセンスは、プロパティ mainLicenseIds に対し、登録済みのライセンスIDの配列を指定する必要があります。
さいごに
基本的なREST APIの呼び出しについて説明してきましたが、今後も情報をお伝えしていきたいと考えています。
もう少し詳しい情報が欲しいなどのご相談がありましたら、こちらからお気軽にお問い合わせください。

