モード変更


    言語

Dify × GAS:社内Difyから組織限定のGoogle Driveにアクセスする

2026/02/05

AI & Digital Partners をビジョンに掲げるモンスターラボでは、全社員にDifyアカウントが提供されています。これにより、誰でも自由にワークフローやエージェントを開発し、社内に展開できる環境が整っています。当社では、顧客企業をはじめとする各種規定を遵守しつつ、AI活用を推進できるよう、AIの活用に関する社内ポリシーを制定しています。

しかし、DifyからGoogle Driveと連携しようとすると一つの壁にぶつかります。会社のGoogle Workspaceでは、ドライブの共有範囲が組織内に限定されており、先述のポリシーに則った利用の場合も制限が掛かってしまう場合があります。

本記事では、この制約を回避するためにGoogle Apps Script(GAS)でAPIを作成し、Default Application Credentialsで認証する方法を紹介します。

背景:なぜGAS APIが必要なのか

DifyにはGoogle Drive連携の機能がありますが、組織のセキュリティポリシーによっては直接アクセスできないケースがあります。そこで、GASをAPIのプロキシとして利用することで、Difyから間接的にGoogle Driveやスプレッドシートにアクセスできるようになります。

GASでAPIを作成する

開発環境の準備

GASの開発には clasp が便利です。ローカルでTypeScriptを使った開発ができ、AIコーディングアシスタントとの相性も良いです。

npm install -g @google/clasp
clasp login
clasp create --type webapp

APIエンドポイントの実装

GASでは doGet や doPost 関数を定義することでHTTPリクエストを受け付けられます。

function doGet(e: GoogleAppsScript.Events.DoGet): GoogleAppsScript.Content.TextOutput {
  console.log('GET request received');
  
  // ここでGoogle Driveやスプレッドシートの操作を行う
  
  return ContentService.createTextOutput(JSON.stringify({ status: 'success' }))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e: GoogleAppsScript.Events.DoPost): GoogleAppsScript.Content.TextOutput {
  const payload = JSON.parse(e.postData.contents);
  
  // スプレッドシートへのデータ追記など
  
  return ContentService.createTextOutput(JSON.stringify({ status: 'success' }))
    .setMimeType(ContentService.MimeType.JSON);
}

デプロイ

GASエディタから「デプロイ」→「新しいデプロイ」を選択し、ウェブアプリとして公開します。

公開後、以下の形式のURLでAPIを呼び出せます:

https://script.google.com/macros/s/{DEPLOYMENT_ID}/exec

認証の課題

ここで問題が発生します。組織内ユーザーにアクセスを限定している場合、APIを呼び出すにはGoogleアカウントの認証が必要になります。

DifyからこのAPIを呼び出すには、何らかの方法でアクセストークンを取得し、リクエストに含める必要があります。

解決策:Default Application Credentials

今回は Application Default Credentials(ADC) を利用してアクセストークンを取得します。

ADCは、Google Cloud SDKやクライアントライブラリが認証情報を自動的に検出するための仕組みです。ローカル開発環境では gcloud auth application-default login で作成した認証情報が使われます。

必要なスコープ

GASウェブアプリへのアクセスに必要な最小限のスコープは以下の通りです:

スコープ必要性理由
openid必須認証の基本
drive必須GASウェブアプリへのアクセスに必要
userinfo.email任意Session.getActiveUser().getEmail() を使う場合
cloud-platform任意gcloud CLIが要求するだけ。直接取得なら不要

認証情報の作成

gcloud auth application-default login \
  --scopes="openid,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive"

実行すると、認証情報が以下に保存されます:

# macOS / Linux
~/.config/gcloud/application_default_credentials.json

# Windows
%APPDATA%\gcloud\application_default_credentials.json

アクセストークンの取得

保存された認証情報からアクセストークンを取得するには、refresh_tokenを使ってトークンエンドポイントにリクエストします:

curl -X POST https://oauth2.googleapis.com/token \
  -d "client_id={CLIENT_ID}" \
  -d "client_secret={CLIENT_SECRET}" \
  -d "refresh_token={REFRESH_TOKEN}" \
  -d "grant_type=refresh_token"

Dify 上でのトークン取得

前述のように、Default Application Credentials として保存された認証情報を用いてアクセストークン取得APIを叩きます。 今回は、DifyのHTTPリクエストブロックを利用しました。

application_default_credentials.jsonに記載されている、 client_id, client_secret, refresh_tokenを利用します。 Difyには、認証情報をシークレットとして安全に管理してください。

HTTPリクエストブロックは、下図のように設定します。

  • ヘッダー
    • Content-Type: application/x-www-form-urlencoded
  • ボディ
    • x-www-form-urlencoded
    • client_id : シークレットに保存した client_id
    • client_secret : シークレットに保存した client_secret
    • refresh_token : シークレットに保存した refresh_token
    • grant_type: refresh_token

blog_dify_gas_get_access_token

Difyからの呼び出し

取得したアクセストークンをAuthorizationヘッダに付与してGAS APIを呼び出します。 リクエストするメソッドとURLは先述の通り、GASのDeploymentに応じて https://script.google.com/macros/s/{DEPLOYMENT_ID}/exec を呼び出します。

Authorization: Bearer {ACCESS_TOKEN}

blog_dify_gas_request_api

セキュリティ上の考慮事項

この方法を採用する際は、以下の点に注意が必要です:

  • 認証情報の漏洩リスク:Default Application Credentialsが漏洩すると、なりすましが可能になります。このリスクを、以下の条件のもとコントロールしています。
    • スコープの最小化:必要最小限のスコープのみを指定し、権限を絞っている
    • アクセス制限:Difyが社内からのアクセスに限定されている
    • シークレット管理:Dify上では認証情報をシークレットとして管理し、ワークフロー定義に直接書かない

まとめ

DifyからGoogle Drive上のファイルにアクセスする手段として、GASを用いたAPIを作成しました。組織のアクセス制限を回避するため、Default Application Credentialsを使ってアクセストークンを取得し、認証を行っています。

この仕組みにより、Difyを活用した社内のAI駆動DXをさらに推進できます。

参考リンク

  • Application Default Credentials(ADC)- Google Cloud
  • clasp - Google Apps Script CLI
  • Dify Documentation
ai-driven-developmentaidddify

Author

Kiyotaka Kunihira

Kiyotaka Kunihira

バックエンド/テックリード/スクラムマスター/エンジニアリングマネージャー

新卒でスマートフォン向け乙女ゲーム開発をしつつAWS, Scalaに触れ Scala忍者に。その後、スタートアップを2社経験して、2019年にモンスターラボに入社。 大阪オフィスに所属している2児の父。 去年、認定スクラムマスター資格取得しました。 最近は、エンジニアリングマネージャーとして中間管理職しています。

その他おすすめ記事

2026/07/07

FastAPI × Diffusers でローカル完結の「顔属性変換」学習アプリをつくる

生成 AI を「使う」だけでなく「アプリに組み込む」とどうなるのか。これを手を動かして理解したくて、人物写真をアップロードすると顔の属性(性別的な見た目)だけを別の性別に変換する学習用 Web アプリを個人で作りました。外部の画像生成 API には一切頼らず、推論まですべてローカルで完結させているのが特徴です。本記事では、その構成と実装上の判断、つまずいた点を技術寄りに整理して共有します。 なぜ「ローカル完結」にこだわったのか 顔写真は最もセンシティブな個人データのひとつです。学習目的とはいえ、自分や知人...

Ryuji Takano

Ryuji Takano

Machine Learning

2026/06/30

AIで生演奏のピッチ検出を試してみた

さて。このAI全盛期、我が社でも例に漏れずAIをうまく使っていこうという流れがきているため、AIを使った技術の検証をしてみようと思います。 どうせなら自分に身近なテーマを、ということで長らく趣味で習っているヴァイオリンのピッチ判定ができたら面白そうです。 調べてみたところいくつか使えそうなAIモデル(CREPE、Basic Pitch)があったため使えるか検証していきます。 また、比較用としてAIを使っていない従来の方式のaubioも試してみましょう。 はてさて、全てうまく動くでしょうか...。 環境構...

Mayumi Ishiyama

Mayumi Ishiyama

Machine Learning

サービス開発実績会社情報
採用情報インサイトお問い合わせ
© 2022 Monstarlab
情報セキュリティ基本方針個人情報の取り扱いについて個人情報保護方針