先日、IBM Watson のサービスが IAM (Identification & Access Management)およびリソースグループに対応した、というニュースがありました:
IBM Watson AI のサービスについて、IAM およびリソースグループが有効に


この対応により、IBM Watson API を使うサービスの認証方式が変更になります。現行の(この変更前に作ったものの)方式は 2019/10/31 まで有効ですが、それ以降は認証エラーになってしまいます。また 2018/11/01 以降に作成した Watson サービスインスタンスは新しい認証方式でないと接続できなくなっています。

要は Watson サービスを使って今動いているアプリケーションは1年以内にこの新しい認証/認可の方式に対応させる必要があり、また新しく作るアプリケーションに関しては新しい認証/認可方式を使って作成する必要がある、ということになります。この「Watson の新しい認証/認可方式を使ってアプリを作成」するための手順を紹介します。

【新しい認証/認可方式に対応した Watson サービスのインスタンス化】
まず、新しい認証/認可方式に対応した Watson サービスを用意する必要があります。今回は比較的多く使われていると思われる画像認識機能 Visual Recognition API を使って紹介しますが、基本的には全てのサービスで同様の方法を実装することになります。

2018/11/07 時点で、IBM Cloud 内で新しく Visual Recognition サービスを作成すると、新しい認証/認可方式に対応したインスタンスとなります。というわけで IBM Cloud にログインし、リソースの作成にて「AI」カテゴリの Visual Recognition を選択します:
2018110701


インスタンスの属性を選択します。以前はここで「ロケーション」に加え「組織」や「スペース」を選択していたのですが、新しいインスタンスではロケーションとリソースグループ(default のままで大丈夫です)を選択します:
2018110702


下にスクロールしてサービスのプランを選択します(下図では無料版の Lite を選択しています)。最後に右下の「作成」ボタンでインスタンスを作成します:
2018110703


作成したインスタンスの画面がこちらです。この画面で API KeyURL が確認できます(API Key は当初マスキング処理されています):
2018110704


クレデンシャル情報を表示させることで一時的に API Key を確認することができます。新しい認証/認可方式ではこの API Key を使ってサービス API を利用することになります:
2018110705



【新しい認証/認可方式に対応したアプリケーション】
次に、アプリケーション側をこの新しいサービスインスタンスに対応した形で作り直します。今回は Node.js と Watson Developer Cloud SDK を使う前提でアプリケーションを作る想定で以下を記述します。

新しい認証方式の Visual Recognition では以下のようなコードで認証し、インスタンスオブジェクトを作成します:
//. test01.js
var fs = require( 'fs' );

//. https://www.npmjs.com/package/watson-developer-cloud
var vr_v3 = require( 'watson-developer-cloud/visual-recognition/v3' );

var vr = new vr_v3({
  url: "https://gateway.watsonplatform.net/visual-recognition/api",
  version: '2018-03-19',
  iam_apikey: "(上記で取得した API Key)"
});

var filename = 'sample.png';
if( process.argv.length >= 3 ){
  filename = process.argv[2];
}

var params = {
  images_file: fs.createReadStream( filename )
};

vr.classify( params, function( err, result ){
  if( err ){
    console.log( err );
  }else{
    console.log( JSON.stringify( result, null, 2 ) );
  }
});

青字部分は API Key を取得した時に同時に表示されていた URL の値を url に指定しています。また赤字部分は取得した API Key 文字列を iam_apikey に指定しています。この形でインスタンスオブジェクト(上記コードだと vr 変数)を作成する必要がある、という点がこれまでと異なります。

なお、上記コードで作っているコマンドアプリ(test01.js)は
$ node test01 (画像ファイル名)

という形で指定して実行することを想定しています。(画像ファイル名)部分に画像認識を実行する画像のファイルパスを指定します(無指定の場合は同じフォルダにある sample.png に対して実行します)。

今回はいらすとや様の、この画像を sample.png として用意しました:
sample01


この画像に対して実行してみます。まず Watson Developer Cloud SDK を導入します:
$ npm install watson-developer-cloud

そして実行(実行結果は緑字):
$ node test01

{
  "images": [
    {
      "classifiers": [
        {
          "classifier_id": "default",
          "name": "default",
          "classes": [
            {
              "class": "first-aid kit",
              "score": 0.879,
              "type_hierarchy": "/kit of things/first-aid kit"
            },
            {
              "class": "kit of things",
              "score": 0.879
            },
            {
              "class": "dado (dice)",
              "score": 0.5
            },
            {
              "class": "figure",
              "score": 0.79
            },
            {
              "class": "jade green color",
              "score": 0.77
            },
            {
              "class": "emerald color",
              "score": 0.511
            }
          ]
        }
      ],
      "image": "sample.png"
    }
  ],
  "images_processed": 1,
  "custom_classes": 0
}

(結果はともかく)新しい認証/認可方式のコードで実行できました!