Web3.0

【Ruby】Venly APIの認証を行うための便利なメソッドを作る

POST URBAN社では、Venly APIを使用してNFTの独自マーケットプレイスを制作していました。

Venly APIで用意されているWallet API・NFT API・Market APIを全て使って、誰でも簡単にNFTを作成し、販売できるプラットフォームを作りました。

その際に、どのようにしてVenlyを使ってプラットフォーム構築をしたかは、以下の記事にまとめてあります。

Venly APIを使ったNFT独自マーケットプレイスの作り方

Venly APIの使い方

Venly APIは主に3つのAPI群が用意されてあります。

Wallet API

EthereumやPolygonなどの暗号通貨Walletを簡単に作成し、管理できるAPIです。

NFT API

NFTを作成するためのERC 1155スマートコントラクトを作成し、NFTメタデータを登録し、NFTをMint(作成)できるAPIが揃っています。

Market API

NFTマーケットプレイスを作成するのに便利な、NFTを販売できるAPIが用意されています。

これらの3つのAPIを使用すれば基本的にはNFTに関するほとんどの機能を実現できます。

Venly APIの認証

上記の3つのAPIを使うために、事前に運営から配布されたClient IDとClient SecretからAPIのAccess Tokenを取得して、認証する必要があります。

今回は、その認証を簡単にできるようにするRuby(Ruby on Rails)のクラスを解説していきます。

公式ドキュメント:How to authenticate - Venly API

Venly APIは全て基本的にBearer認証を使用してアクセスする必要があります。

そこで、各APIを叩く前にBearer用のTokenを取得します。

Bearer Tokenを取得する

公式ドキュメント:How to get a Bearer token - Venly API

Venlyに登録するとAPI使用用のClient IDとClient Secretが配布されます。

それらを使用してBearer Tokenを取得します。

今回は、RubyでPOSTリクエストを送信するために、Faraday を使用します。

まず、リクエスト用のclientを取得するメソッドを作ります。


def client(domain)
  url = URI::Generic.build(scheme: "https", host: domain).to_s

  Faraday.new(url: url) do |faraday|
    faraday.adapter :net_http
    faraday.response :json
  end
end

これで、準備ができました。

Bearer Tokenを取得するAPIのエンドポイントは /auth/realms/Arkane/protocol/openid-connect/token です。

また、POSTするパラメータが3つ必要です。


CLIENT_ID = "Testaccount-capsule"
CLIENT_SECRET = ".................."

params = {
  grant_type: "client_credentials", # これは固定でこの値
  client_id: CLIENT_ID,
  client_secret: CLIENT_SECRET
}

また、リクエストヘッダーで Content-Typeapplication/x-www-form-urlencoded にして送ります。


headers = {
  "Content-Type": "application/x-www-form-urlencoded"
}

これらをメソッドにまとめます。


DOMAIN = "login-staging.arkane.network"
CLIENT_ID = "Testaccount-capsule"
CLIENT_SECRET = ".................."

def request_access_token
  path = "/auth/realms/Arkane/protocol/openid-connect/token"
  params = {
    grant_type: "client_credentials",
    client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET,
  }
  headers = {
    "Content-Type": "application/x-www-form-urlencoded"
  }
  res = client(DOMAIN).post(path, params.to_query, headers)

  return nil unless res.success?

  res.body
end

これを叩くとこのようなレスポンスが返却されます。


{
  "access_token" => "ey.........",
 "expires_in" => 300,
 "refresh_expires_in" => 3456000,
 "refresh_token" => "ey.........",
 "token_type" => "bearer",
 "not-before-policy" => 1572970662,
 "session_state" => "a2f27eb2-b741-4a18-b8be-9501d850fd7a",
 "scope" => "view:wallets whitelabel market:buy:sale export:wallets email use:all-wallets sign:wallets view:profile market:create:sale save:transaction profile"
}

この access_token をBearer Tokenとして使います。

アクセストークンには使用期限(expires_in)が設けられているので、使用期限が切れると再取得する必要があります。

これをRailsのキャッシュシステムを使用して一定期間だけキャッシュし、期限が切れた時だけ再度アクセストークンを取得するようにします。


CACHE_KEY = "/venly/auth/access_token"

def get_accress_token
  Rails.cache.fetch(CACHE_KEY, expires_in: 300.second) do
    request_access_token
  end
end

これでget_access_tokenを使えば、必要なタイミングで都度アクセストークンを取得し直してくれるようになります。

試しにEthereumの現在のガス代を取得する

Ethereumの現在のガス代を取得するエンドポイントを試しに叩いてみます。(https://docs.venly.io/api/api-products/wallet-api/get-fees


def get_fees
  path = "/api/transactions/ETHEREUM/fees"
  params = {}
  headers = {
    "Authorization": "Bearer #{get_accress_token}"
  }
  res = client(DOMAIN).get(path, params, headers)

  return nil unless res.success?

  res.body
end

# get_feesを叩くと以下のレスポンスが返ってくる
{
  "success" => true, "result" => [{
    "gasPrice" => 310200000000,
    "defaultPrice" => false
  }, {
    "gasPrice" => 353100000000,
    "defaultPrice" => true
  }, {
    "gasPrice" => 445500000000,
    "defaultPrice" => false
  }, {
    "gasPrice" => 479600000000,
    "defaultPrice" => false
  }]
}

いかがでしたでしょうか。

このようにして、REST API形式で用意されているVenlyのAPIを叩くために必要なAccess Tokenを取得できるようになりました。

ここまで出来れば、あとはAuthorizationヘッダーにセットして使いたいAPIを叩けばVenly APIが好きに使えます。

是非お試しください。

Good Luck Have Fun :)