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と現在時刻の間にもスペースが必要です。
認証を受ける
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>, <パスワード> )