mBaaSお役立ちブログ

RubyからmBaaSにアクセスしてみる

Ruby

ニフティクラウド mobile backendはその名称通り、モバイル/タブレットアプリのバックエンド向けの機能を提供していますが、そのデータメンテナンスや追加データが管理画面経由のみではシステムの自動化ができず面倒ですよね。

そこでニフティクラウド mobile backendではREST APIを提供しており、自由にそのデータを外部から操作できるようにしています。

REST API リファレンス:共通フォーマット | ニフティクラウド mobile backend

多くのWeb APIが用いているシグネチャ方式での認証となっています。JavaObjective-CJavaScriptとSDKが提供されている各言語向けシグネチャ生成方式を紹介していますが、既存のサーバと連携しようと思ったらサーバサイドのプログラミング言語のが使い勝手良いでしょう。

ということでRubyを用いたシグネチャ生成&APIアクセスの方式を紹介します。

まず最終的なコードから。Gistにも公開してありますのでそちらでもご覧ください。

# -*- coding: utf-8 -*-
require 'time'
require 'openssl'
require 'Base64'
require "net/http"
require "uri"
APPLICATION_KEY = 'your_application_key'
CLIENT_KEY      = 'client_key'
DOMAIN          = "mb.api.cloud.nifty.com"
 
def ncmb_query(method, path, queries = {})
  encoded_queries = {}
  queries.each do |k, v|
    encoded_queries[URI.encode(k.to_s)] = URI.encode(v.to_s)
  end
  params_base = {
    "SignatureMethod" => "HmacSHA256",
    "SignatureVersion" => "2",
    "X-NCMB-Application-Key" => APPLICATION_KEY
  }
  params = params_base.merge(encoded_queries)
  now = Time.now.utc.iso8601
  params = params.merge "X-NCMB-Timestamp" => now
  params = Hash[params.sort{|a, b| a[0].to_s <=> b[0].to_s}]
  query = encoded_queries.collect{|k,v| "#{k}=#{v}"}.join('&')
  signature_base = <<-EOS
#{method}
#{DOMAIN}
#{path}
#{params.collect{|k,v| "#{k}=#{v}"}.join("&")}
  EOS
  signature_base.chomp!
  signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha256'), CLIENT_KEY, signature_base)).strip()
  http = Net::HTTP.new(DOMAIN, 443)
  http.use_ssl=true
  headers = {"X-NCMB-Application-Key" => params_base["X-NCMB-Application-Key"], 
    "X-NCMB-Signature" => signature,
    "X-NCMB-Timestamp" => now,
    "Content-Type" => 'application/json'}
  path = path + (query == '' ? "" : "?"+query)
  if method == "GET"
    return http.get(path, headers).body
  else
    return http.post(path, headers).body
  end
end
 
if __FILE__ == $PROGRAM_NAME
  path = "/2013-09-01/classes/TestClass"  # 実行するURL
  queries = {:count => "1", :limit => "20", :order => "-createDate", :skip => "0", :where => '{"message":"test"}'} # クエリ
  puts ncmb_query "POST", path, queries
end

APPLICATION_KEY と CLIENT_KEY は管理画面コンソールから取得して書き換えてください。

クエリのURIエンコードに注意

whereパラメータは検索条件にJSONを使います。そのため各クエリパラメータはURIエンコードしてください。

署名日時はUTCのISO8601形式で

日時はタイムゾーンなどが入っていてはいけないので、 now = Time.now.utc.iso8601 のようにしてください。

署名する文字列を作成

class=”prettyprint lang-rb” signature_base = <<-EOS
#{method}
#{DOMAIN}
#{path}
#{params.collect{|k,v| “#{k}=#{v}”}.join(“&”)}
EOS

のようにして署名する文字列を作成します。例えば次のようになります。

GET
mb.api.cloud.nifty.com
/2013-09-01/classes/TestClass
SignatureMethod=HmacSHA256&SignatureVersion=2&X-NCMB-Application-Key=your_application_key&X-NCMB-Timestamp=2014-05-06T05:31:50Z&count=1&limit=20&order=-createDate&skip=0&where=%7B%22message%22:%22test%22%7D

並び替えは大文字から小文字、AからZの順番になります。

署名はSHA256のハッシュをBase64エンコード

以下の処理部分になります。

signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha256'), CLIENT_KEY, signature_base)).strip()

CLIENT_KEY を使って署名を作ります。クライアントキーは管理画面コンソールから取得してください。

後はプログラムを実行すると、次のようにレスポンスが得られます。

{"count":1,"results":[{"objectId":"D8s9Mqd9rANrauF3","createDate":"2014-04-08T09:16:11.544Z","updateDate":"2014-04-08T09:16:11.544Z","acl":{"*":{"read":true,"write":true}},"message":"test"}]}

REST APIでは、

  • データストア(CRUD + 検索)
  • 会員管理(登録、ログイン、ログアウト、ロール管理など)
  • ファイルストア(CRUD + 検索)

とニフティクラウド mobile backend内の一通りのデータ操作ができるようになっています。これらの機能を使うと、既存のデータとクラウド内のデータを連携させたり、自社Webサービスでユーザ登録した際にニフティクラウド mobile backend にデータを登録して、iOS/Androidアプリでもログインできるようにするといった仕組みも簡単に実現できるでしょう。

プッシュ通知の管理を自動化したり、開封通知や利用度合いのマーケティングデータを取得して社内のデータとマッチングさせるといった自動化も考えられそうです。

ぜひスマートフォン/タブレットの枠を越えてニフティクラウド mobile backendを役立ててください!










バックナンバー