ぶていのログでぶログ

思い出したが吉日

onelogin-ruby-sdk v3.0.0-alpha.1を使う

注意: この記事で紹介しているonelog-ruby-sdk v3.0.0-alpha.1は開発版であり今後大幅に変更される可能性がある

OneLoginのAPIをRubyから操作するライブラリとしてonelogin-ruby-sdkがある。 OneLogin公式が提供しているライブラリで安心感があるのだが、このライブラリはOneLogin API v2には対応していない。 OneLogin API v2ではロールの作成など様々な機能が追加されているのでそれを使いたいのだが、onelogin-ruby-sdkではそれができないので悩んでいた。 しかしある時、onelogin-ruby-sdkのv3.0.0-alpha.1が出ていることに気がついた。 v3.0.0-alpha.1はOneLogin API v2に対応していたので使うことにした。

v3.0.0-alpha.1での変更点

すべて変わっていると言って良い。 というのも、OneLogin API v2からはどうもOpenAPIに対応したらしく*1、v3.0.0-alpha.1はopenapi-generatorを使って生成されているようだった。 ちなみに、Ruby以外にもGolangなど公式のライブラリが提供されているがそれらのopenapi-generatorを使って生成されていそうだった。 そんなわけで、コードベースが変わってしまい今までのコードをそのまま使うことができなくなってしまった。

ユーザ一覧を取得する例

以下に、v3.0.0-alpha.1でのユーザ一覧を取得する例を示す。

require 'onelogin'

# クレデンシャルを設定
client_id = '<client idを指定>'
client_secret = '<client secretを指定>'

# 接続先を設定
OneLogin.configure do |config|
  config.host = 'xxxx.onelogin.com'
  # config.debugging = true
end
client = OneLogin::DefaultApi.new

# アクセストークンを取得
auth = "client_id:#{client_id}, client_secret:#{client_secret}"
generate_token_request = OneLogin::GenerateTokenRequest.new
generate_token_request.grant_type = 'client_credentials'
token = client.generate_token(auth, generate_token_request)

# ユーザ一覧を取得
authorazation = "bearer #{token.access_token}"
pp client.list_users(authorazation)

ちなみに、openapi-generatorで生成されたコードはだいたいこのようなコードになるので覚えておくと便利かもしれない。

ラッパークラスを定義して便利にする

上記例ではlist_usersしか呼び出していないが、認証が必要なAPI呼び出しではauthorazationを毎度指定しないといけないので不便だ。 そこで、以下のようなラッパークラスを用意するとめんどくささが少し緩和される。

require 'onelogin'

module OneLogin
  class Api
    def initialize(client_id, client_secret, client = ApiClient.default)
      @client = DefaultApi.new(client)
      @access_token = generate_token(client_id, client_secret).access_token
    end

    def generate_token(client_id, client_secret)
      auth = "client_id:#{client_id}, client_secret:#{client_secret}"
      generate_token_request = OneLogin::GenerateTokenRequest.new
      generate_token_request.grant_type = 'client_credentials'
      @client.generate_token(auth, generate_token_request)
    end

    def authorazation
      "bearer #{@access_token}"
    end

    DefaultApi.public_instance_methods(false)
              .reject { |m| m =~ /api_client|generate_token|_with_http_info/ }
              .each do |name|
      define_method(name) do |*args|
        @client.send(name, authorazation, *args)
      end
    end
  end
end

# ユーザ一覧を取得する例
client_id = '<client idを指定>'
client_secret = '<client secretを指定>'

OneLogin.configure do |config|
  config.host = 'xxxx.onelogin.com'
  # config.debugging = true
end

client = OneLogin::Api.new(client_id, client_secret)
pp client.list_users

*1:スキーマ情報が見つからずどこにあるかわからない