無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Adobe Share APIで認証を受ける。

Adobe Share APIですが、なんとか認証まではできました。以下はここまでの道のりです。

APIキーの取得

Share APIを利用するには、APIキーが必要です。Share Developers siteの「Manage/Get API Developer Key」から発行してもらいます。このとき認証で使う「shared secret」も提供されます。発行は無料ですが、Adobe IDが必要です。

公開鍵証明書の取得

APIとのやりとりはHTTPSで行われるので、Rubyの場合、公開鍵証明書を用意する必要があります。以前書いた手順で証明書を入手し使用しました。なお、「api.share.adobe.com」向けに発行された証明書では動作しなかった(certificate verify failedになる)ため、親の「Class 3 Public Primary Certification Authority」の証明書を使用しました。

認証ヘッダの作成

Share APIではすべてのリクエストに認証ヘッダを含める必要があります。具体的には、"AdobeAuth "から始まり以下のパラメータを含む文字列を、HTTPの"Authorization"ヘッダに設定してリクエストを送付します。

  • apikey: APIキー
  • data: HTTPメソッド、URL、現在時刻を" "区切りで連結した文字列。
  • sig: 「data + shared secret」のハッシュ
  • sessionid: セッションID。認証時には不要。
Authorization: AdobeAuth apikey="xxxxxxxxxxxxxxxxxxxxxxxx",data="POST https://api.share.adobe.com/webservices/api/v1/auth/ 1191580057",sig="73f0d358bf7d930c75763f116a01fa98"
dataの作成

HTTPメソッド、URL、現在時刻を" "区切りで連結した文字列です。Adobe Share APIでは、

data="GET https://api.share.adobe.com/webservices/api/v1/dc/1188518642796"

とかなっているので注意。URLと現在時刻の間にもスペースが必要です。

sigの作成

「data + shared secret」をMD5でハッシュにしたものです。認証の際の「shared secret」はAPIキー発行時に提供されたもので良いようです。(セッション開始後は新しい「shared secret」が発行されるみたいですが、まだそこまっで行ってないので詳細はゆくゆく)

認証を受ける

Adobe Share API - Requesting an authorization tokenの手順の通り、

https://api.share.adobe.com/webservices/api/v1/auth/

にリクエストを送付し、認証を受けます。リクエストボディでユーザーIDとパスワードを送付します。認証に成功すると認証トークンが返されます。

リクエストボディの改行

環境やソースコードの改行の問題かもしれませんが、リクエストボディに改行を含めていると「BadFormat」のエラーになりました。ご注意。

認証までのコード

以下は認証までのサンプルです。SSL対応版HTTPアクセスユーティリティを使っています。

require 'http-requestor' # HTTPアクセスユーティリティ
require 'digest/md5'
require "rexml/document"

# Adobe Share クライアント
module Share

class Client

  def initialize( api_key, shared_secret, user_name, password )
    @api_key = api_key
    @shared_secret = shared_secret
    @user_name = user_name
    @password = password
    @hr = HttpRequestor.new( File.dirname(__FILE__) + "/share-requests.yaml")
    @authtoken = login  # ログイン

    puts @authtoken # とりあえず。
  end

  def session( &block )
  end

private

  # ログインする。
  def login()
    res = @hr.auth() { |req|
      h = req["headers"]

      # 認証ヘッダ / TODO 関数化
      data = req["method"] + " https://" + req["host"] + req["path"] + " " + Time.new.to_i.to_s
      auth = "AdobeAuth"
      auth << "apikey=\"" << @api_key << "\","
      auth << "data=\"" << data << "\","
      auth << "sig=\"" << Digest::MD5.hexdigest( data + @shared_secret ) << "\""
      h["Authorization"] = auth
      
      # リクエストボディ
      req["body"] =<<-POST
        <request>
          <username>#{@user_name}</username>
          <password>#{@password}</password>
        </request>
      POST
      req["body"].gsub!( /\n/, "" ) # 改行を取る。
    }
    res = parseResponse( res.body )
    return res[:param]["authtoken"]
  end

  # レスポンスを解析する
  def parseResponse( body )
    p body
    doc = REXML::Document.new(body)
    res = {
      :status => doc.attributes["status"],
      :param  => {}
    }
    doc.elements.each("./response/*") { |item|
      res[:param][item.name] = item.text
    }
    return res
  end
end

end

接続の設定ファイル(share-requests.yaml)は以下です。 サーバーの公開鍵証明書を設定する必要があります

---
conf:
  #proxy_host: <プロキシホスト>
  #proxy_port: <プロキシポート>

default:
  host: api.share.adobe.com
  path: /webservices/api/v1/
  port: 443
  ssl: true
  ca_file: "./ca.cer" # サーバーの公開鍵証明書
  headers:

requests:
  auth:
      path: /webservices/api/v1/auth/
      method: POST

呼び出しサンプルです。コンストラクタ内でログインまで実行します。

Share::Client.new(<APIキー>, <shared secret>, <ユーザーID>, <パスワード> )


参考:Adobe Share API