はじめに

前回取り上げた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
}
                        

この作業は一度実施すれば、次回以降同じ情報を利用できます。登録した情報は、 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の呼び出しについて説明してきましたが、今後も情報をお伝えしていきたいと考えています。
もう少し詳しい情報が欲しいなどのご相談がありましたら、こちらからお気軽にお問い合わせください。

関連記事

タグ一覧

ジャンル
    キーワード
      作者名

        新着記事

          ソフトウェア部品管理ソリューション コンテンツ一覧

          関連商品・キーワード