0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Workato] ConnectorSDK ユーザー認証(OAuth)とサーバー間認証(JWT)を切り替える。Boxカスタムコネクタの実装方法

0
Posted at

はじめに

iPaaSであるWorkatoには、標準でBoxコネクタが用意されています。しかし、標準コネクタは主に OAuth 2.0(ユーザーコンテキスト) を前提としており、以下のケースで制約が生じることがあります。

  • サービスアカウント(App Users)として、特定の個人に依存せず自動化したい
  • 管理者が任意のユーザーの代理として操作したい(As-User機能の柔軟な利用)

本記事では、WorkatoのConnector SDKを使用して、「OAuth2.0」と「サーバー認証(JWT)」を設定画面で選択に応じて切り替え可能にする実装パターンを紹介します。

比較項目 OAuth2.0 サーバー認証(JWT)
接続の安定性 不安定。ユーザーのパスワード変更で切れる可能性あり。 安定。鍵を更新しない限り有効。
退職リスク あり。接続した個人に依存する。 なし。システムアカウントとして自立。
Boxライセンス 既存ユーザー枠を利用。 サービスアカウントとして存在。

↓実装画像↓

実装のポイント解説

今回のカスタムコネクタにおける最大の特長は、以下の点です。

  1. 認証方式を選択させる仕組み: ユーザーが設定画面で認証方式を選択できるUIを提供。
  2. サーバー認証(JWT)の実装ロジック: Workato内部でOpenSSLを使用し、Box API仕様に準拠した署名を実施。
  3. 任意ユーザーへの代理(As-User)機能: As-Userヘッダーをアクションごとに指定可能にする。

1. 認証方式を選択させる仕組み

Workato SDKの multi 認証タイプを利用すると、ユーザーの入力に応じて認証フローを選択に応じて切り替えられます。

接続設定の定義 (Connection Fields)
ユーザーに認証タイプを選ばせるためのフィールド auth_type を定義します。
これにより、ユーザーが「OAuth2.0」を選べばクライアントID/Secretの入力欄が、「JWT」を選べば秘密鍵などの入力欄が表示されるようになり、UXを損なわずに高度な機能を実装できます。

#接続設定の定義のイメージ
connection: {
  fields: [
    {
      name: "auth_type",
      control_type: "select",
      pick_list: [["OAuth2", "oauth2"], ["JWT", "jwt"]],
      extends_schema: true
    }
  ],
  
  # ここでauth_typeの値に応じて分岐させる
  authorization: {
    type: "multi",
    selected: lambda do |connection|
      connection["auth_type"]
    end,
    
    options: {
      # OAuth2.0を選択した場合の設定
      oauth2: {
        type: "oauth2",
        # ... (標準的なOAuth設定)
      },
      
      # JWTを選択した場合の設定
      jwt: {
        type: "custom",
        # ... (後述するJWT設定)
      }
    }
  }
}

2. サーバー認証(JWT)の実装ロジック

Boxのサーバー認証(JWT)を行うためには、以下のステップをコード内で実行する必要があります。

  1. 暗号化された秘密鍵をパスフレーズで復号する。
  2. Boxが要求するクレームを含むJSONを作成する。
  3. RSA(RS256)アルゴリズムで署名し、JWTアサーションを生成する。
  4. 生成したアサーションをBoxのトークンエンドポイントに送信し、アクセストークンを取得する。

ポイント

  • 秘密鍵のサニタイズ: ユーザーが入力フォームやJSON設定ファイルから秘密鍵を貼り付けた際、改行コード(\n)が適切に処理されないと署名エラーになります。.gsub('\n', "\n") などの処理が必要です。
  • 複合処理: BoxのprivateKeyは暗号化されています。OpenSSL::PKey::RSAで複合する必要があります。
  • JTI: JTI(JWT ID) は、トークンの一意性を保証するためのものです。同じ JTIを持つリクエストを再利用(リプレイ攻撃)されるのを防ぐため、多くのAPIサーバーでは一度使ったJTIを短時間キャッシュし、拒否する仕組みになっています。SecureRandom を使用してJTIを生成し、リプレイ攻撃を防いでいます。

3. 任意ユーザーへの代理(As-User)機能

JWT認証(特に管理者権限)を使用する場合、特定ユーザーの代わりに操作を行うAs-User ヘッダーを使用できます。これを各アクションの input_fields で定義できるようにします。

# 入力スキーマに追加ヘッダー用の定義をマージするイメージ
additional_header: {
  fields: lambda do |connection, config_fields, object_definitions|
    [
      {
        name: "additional-header",
        type: "object",
        properties: [
          { name: "as-user", label: "As-User ID", optional: true, sticky: true }
        ]
      }
    ]
  end
}

まとめ

WorkatoのConnector SDKで multi 認証タイプを活用することで、標準コネクタではカバーしきれない柔軟な運用が可能なコネクタが作成できます。

特にBoxのようなエンタープライズ製品では、認証方式の制約がプロジェクトのボトルネックになりやすいため、この実装パターンをストックしておくと、実装の幅が大きく広がります。

参考リンク

Workato Connector SDK Documentation
Box Developer Documentation - JWT Authentication

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?