注意: この記事で紹介している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:スキーマ情報が見つからずどこにあるかわからない