ページの本文へ

Hitachi

日立ソリューションズ ソフトウェア部品管理ソリューション

OSS管理ブログ

SW360でREST APIを使ってみよう

SW360でREST APIを使ってみよう

はじめに

前回取り上げた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での登録
  1. 管理者権限を持つユーザーでログインします。
  2. SW360のメニュー Admin > OAuth Client を選択します。
  3. 別ウインドウでクライアント管理ページ (http://localhost/authorization/client-management) が開きます。認証画面(通常はBasic認証ダイアログ)が開くので、管理者権限を持つユーザーでログインします。
  4. OAuth Client ページに戻り、Create new client ボタンでダイアログを開きます。情報を入力して Create ボタンを押してクライアントを作成します。
    Create new clientダイアログ
  5. 作成されたクライアントが、 OAuth Client ページに表示されます。 client_id および client_secret が参照できます。
    OAuth Client画面

ポップアップブロックなどでクライアント管理ページが開かなかったり、ログイン失敗した場合、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
}

この作業は1度実施すれば、次回以降同じ情報を利用できます。登録した情報は、 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.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCIsIldSSVRFIl0sImV4cCI6MTY1NTM2NDIwNSwiYXV0aG9yaXRpZXMiOlsiUkVBRCIsIldSSVRFIl0sImp0aSI6Ijk4YTc3NGRjLTVhYTUtNDUyZC04N2ZkLTBkY2U1YWJkZDljYSIsImNsaWVudF9pZCI6IjkzMDc5YTQwOGQ2ZGZmMDY5MWJlMDQ0ZjRjMDAxOGFkIn0.Aqfu72tPoINmD1d8_CUcDGX_jC5IkKDaz1Kxw_m18i2Nrt6X9U-OiQthDC0MXRRxrnHveb-lME9yE8uVQT6bdinalQKKpmc5qUT_sxyKG-gXviCm0lNbxhSX1OmiffV4e-Fy_QOEfRDZrWYxLHNwwNRReqvDwor339Q56eexXr3-3CNrEjCvjZnL5Ig7_wMpIrfi0eEEmdm7DAVxQ1WDvlCu6wnD75PkfJ-Zol-4PkhTc7sqyEScJELiAREv0475ze3wdLQ_6zSZOGsyKfENMZDB6k85QdRxDpRMM3Q9365laMcJAVFwZ7d1jv0IAe2AsM4SqYKBPyFcgk0yZVpfOA",
  "token_type" : "bearer",
  "refresh_token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsic3czNjAtUkVTVC1BUEkiXSwidXNlcl9uYW1lIjoiYWRtaW5Ac3czNjAub3JnIiwic2NvcGUiOlsiUkVBRCIsIldSSVRFIl0sImF0aSI6Ijk4YTc3NGRjLTVhYTUtNDUyZC04N2ZkLTBkY2U1YWJkZDljYSIsImV4cCI6MTY1NTM2NDIwNSwiYXV0aG9yaXRpZXMiOlsiUkVBRCIsIldSSVRFIl0sImp0aSI6IjQ0OWQzNWY5LTFiMzMtNDVhZC1iMDM4LTA0ZDM1MWUyNWU4OSIsImNsaWVudF9pZCI6IjkzMDc5YTQwOGQ2ZGZmMDY5MWJlMDQ0ZjRjMDAxOGFkIn0.WoGWuKB2qTZ02kwNaZO_wUv7mfGd-yrHhvRmD3YsP2AuZ-vzIPm1vGDNH4VifN3crjd0GwBGTlQj4FLMiN02-fcOl7FM06vINmdJy5y3UTuESiqa9-Ks3GhfJPN7UEDJ_mNNJ4-U9nAmF1XM_f4oDfALOe_WtsVKuUEcQxOhmrsFeuQiXWbgJNgfYd3Jv3ofuxqMBaQwxhpkKbFWeyhfU7eRJHawnmiPUxa2Ej3v2nwtZL868I7jzSJj5LdTsGMV3XUwamB8qYynLSda3R3a63xDVLvSWYHqKgdLFN4kK7UqRi_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の呼び出しについて説明してきましたが、今後も情報をお伝えしていきたいと考えています。
もう少し詳しい情報が欲しいなどのご相談がありましたら、こちらからお気軽にお問い合わせください。

オープンソース管理ソリューション
タグ一覧
新着記事