まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:apikey

IBM Watson をはじめとした IBM Cloud から提供されているサービスの認証方法に IAM が採用され始めています。以前に IBM Watson サービスで IAM を使う方法についてはこちらのブログエントリでも紹介しました:
IBM Watson のアプリケーションを IAM(API Key) 認証/認可に移行する


今回は IBM Cloudant を IAM で利用する方法を紹介します。なお 2018/11/22 時点で IBM Cloudant が IAM でないと認証できなくなるというアナウンスがされているわけではないことを書き添えておきます(つまり現時点では従来の認証方法と併用されており、すぐに移行作業が必要になるわけではありません)。


まずは IAM に対応した IBM Cloudant のサービスインスタンスを用意する必要があります。現在 IBM Cloudant のサービスインスタンスを作成すると IAM のみで利用するタイプか、従来の認証と IAM の両方が利用できるタイプかを選択して作成することができます。どちらでもいいのですが IAM 対応のインスタンスを用意します。

まず IBM Cloud のダッシュボードからリソースの追加を行い、データベースカテゴリ内の "Cloudant" を選択します:
2018110701


作成時の認証方法において "Use both legacy credentails and IAM(従来の方法と IAM)" を選択して作成します:
2018110702


これでどちらの方法でも認証できるインスタンスが作成できました:
2018110703


クレデンシャル情報を確認するため、サービス資格情報を参照します。資格情報が作成されていない場合はあらたに1つ作成します:
2018110704


作成した資格情報を選択して参照します:
2018110706


JSON テキスト内に "apikey" と書かれたキー文字列が含まれていることを確認します。この値は後ほど利用します:
2018110707


では IAM で IBM Cloudant を使う Node.js アプリケーションを作成してみます。ソースコードはこんな感じになります:
var fs = require( 'fs' );

//. https://www.npmjs.com/package/@cloudant/cloudant
var CloudantLib = require( '@cloudant/cloudant' );

var options = {
  url: "https://xxxxxx-bluemix.cloudant.com",    //. Cloudant URL
  plugins: {
    iamauth: {
      iamApiKey: "(上記 apikey 文字列)"
    }
  }
};
var cloudant = new CloudantLib( options );
var db = cloudant.db.use( "mydb" );

db.list( { include_docs: true }, function( err, body ){
  if( err ){
    console.log( JSON.stringify( err, null, 2 ) );
  }else{
    console.log( JSON.stringify( body, null, 2 ) );
  }
});

Cloudant へのアクセスには @cloudant/cloudant パッケージを利用しています。このパッケージが既に IAM 対応済みで、上記のように URL と apikey 文字列を指定することでデータベースに接続することができ、データベースインスタンス生成後は従来通りの各種関数が利用できるようになります。


先日、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
}

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


このページのトップヘ