EMIT-Japan WebCT レター

  • 登録・解除
  • プライバシーポリシー

【管理者向けミニティップス】スタンダードAPIをhttp経由で利用する

スタンダートAPI、およびエンタープライズAPIは通常サーバのファイルシステム上で実行される「コマンド」として利用されます。しかし状況によっては外部プログラムからこれらのコマンドを実行する必要がある事があります。ここではスタンダードAPIをHTTP経由で実行する方法を示していきます。

共有秘密値の設定

HTTPリクエストを発生させてサーバと通信するにはサーバとクライアントの間で共有秘密値(Shared Secret Value)という「共通の文字列」を与える必要があります。

まずサーバ側にこの鍵を与える必要があります。以下の手順で行います。

  1. $install_dir/webct/webct/generic/ にcdします。$install_dirはWebCTをインストールしたディレクトリを差します
  2. cdしたディレクトリにapi_secretというファイルがある事を確認します。
  3. このファイルにsecret以外の任意の文字を書きこみます。ただしEOLを付加しないようにしてください。echo -n hogehoge > api_secretのようにecho -nした結果をリダイレクトするのが最も確実です。また文字列は256文字を越えないように設定してください。

以上で鍵の設定は終わりです。念のため書きこんだ文字数とファイルのバイト数が完全に一致している事を確認してください(例えば8文字なら8バイトである必要があります。)

リクエストを発生させるプログラムの記述

続いてクライアントからHTTPリクエストを発生させる必要があります。リクエストメソッドはGETないしPOSTで送ってください。リクセストを送るURLは以下になります。

http://server:port/webct/public/serve_webctdb

またこれらのリクエストにはパラメータとしてMAC(Message Authentication Code)とよばれる共有秘密値から算出した認証コードを付加する必要があります。後程詳細に解説します。

スタンダードAPI(serve_webctdb)の実行

ここではserve_webctdbを実行してHTTPを経由したスタンダードAPIの「find」コマンドを実行してみます。以下のコマンドを実行したものと等価の結果が返る事が期待されます。

$ ./webctdb find global xxxx test ","
Success: WebCT ID=test,Registered Courses=letstry:key,Courses=test:test2:moge:
taki:pre_conference_WS:2004conf:Hajimete:support:sample00,所属=どこにも属さない
(実際には一行)

まずコマンドラインで実行したものと同じ分だけHTTPパラメータを取る必要があります。
以下にパラメータをまとめます

  • OPERATION=find
  • DB=global
  • COURSE=xxxx
  • WebCT%20ID=test

HTTPを経由するので値はurlエンコードされている必要があります
findコマンドでは特に注意する必要は無いかもしれませんが、日本語を扱う際などには気をつけてください。

続いて、これらのパラメータから先述したMACを算出する必要があります。これはWebCT社から配布されるget_md5(get_md5.exe)を用いる事によって計算できます。get_md5はWebCTサーバのgeneric/apiディレクトリにもバンドルされていますが、異なるプラットフォームで実行する必要がある場合は http://download.webct.com より取得できます。

get_md5の基本的な書式は以下のようになります。

Usage: ./get_md5 <secret_file> <data_to_encrypt...>

第一引数にはファイルしか渡せません。サーバ上に設定した共有秘密値を記述したファイル(api_secret)をクライアントサイドにコピーして実行するのが最も確実な方法です。

第二引数にはパラメータの値を結合した文字列を渡します。すなわち今回の例だとfindglobalxxxxtestが渡す値になります。

以下のように実行します。

./get_md5 api_secret findglobalxxxxtest
F39EE0B5194C445EFA233649501E25FB

F39EE0B5194C445EFA233649501E25FBが求めるべきMACという事になります。最後に算出されたMACをAUTHというパラメータの値に設定します。

最終的に発行するリクエストは以下のようなものになります。

http://server:port/webct/public/serve_webctdb?OPERATION=find&DB=global&
   COURSE=xxxx&WebCT%20ID=test&AUTH=F39EE0B5194C445EFA233649501E25FB2
(実際には一行)

テストとしてWebブラウザでこのURLをGETすると以下のような値が返ります。

Success: WebCT ID=test,Registered Courses=letstry:key,Courses=test:test2:moge:
taki:pre_conference_WS:2004conf:Hajimete:support:sample00,所属=どこにも属さない 
(実際には一行)

get_md5コマンドを利用しない方法

MACはget_md5を利用しなくてもプログラム的に算出する事が可能です。HTTPリクエストを発生させるようなプログラムを記述する場合はこのルーチンを組みこんでおいた方が手軽になります。

これを行うにはリクエスト値の文字のASCIIコードを一字ずつ足し込み共有秘密値と結合したもののmd5を算出します。
以下はperlで示した例です。md5の算出にはDigest::MD5を利用しています。

#!/usr/bin/perl -w
use strict;
use Digest::MD5;

{
  my $shared_secret_val = 'hogehoge';
  my $param_str = 'findglobalxxxxtest';
  my $checksum = 0;

  my $md5 = Digest::MD5->new;

  while ($param_str){
    $checksum += ord($param_str);
    $param_str = substr($param_str,1);
  }

  $md5->add($checksum.$shared_secret_val);
  print uc $md5->hexdigest,"\n";
}
文責:エミットジャパン 福山貴幸
(2005年 1月)