Bubble.ioでMicrosoft Entra ID OAuth2ログインが失敗する「Text too long for this field」の原因と回避策

Bubble.ioでMicrosoftアカウント(Microsoft Entra ID)ログインを実装しようとすると、認証の途中で「Text too long for this field」が表示されて先に進めないことがあります。本記事では原因の切り分けと、Bubble側の制限を回避して安定させる実装ポイントをまとめます。

目次

よくある症状:「ログインできそうなのに最後で落ちる」

このエラーは、Microsoftのサインイン画面までは進み、資格情報の入力や多要素認証(MFA)も完了したのに、Bubbleアプリに戻ってきた瞬間にエラー表示になって止まる、という形で現れることが多いです。

  • Microsoftのログイン画面→同意(consent)までは正常
  • リダイレクトでBubble側に戻る
  • トークン取得の直前/直後で「Text too long for this field」
  • Azure(Entra ID)の設定を変えても改善しない

見た目は「OAuthの設定ミス」に見えるのですが、実務ではAzure側の登録が正しくても発生します。

結論:Azure(Entra ID)ではなくBubble側の保存制限に当たっている可能性が高い

「Text too long for this field」は直訳すると「このフィールドには長すぎるテキストです」。つまり、どこかに長い文字列を書き込もうとして失敗しています。Microsoft(Entra ID)のOAuth 2.0/OpenID Connect連携で長い文字列といえば、最有力はトークン(多くはJWT)です。

BubbleのOAuth連携(特にOAuth 2.0 User-Agent Flow系の実装)では、ログイン後に返ってくるアクセストークンやIDトークンをBubble側で保持します。ところが、その保持先が「短いテキストフィールド相当」の上限(目安として約2,000文字前後)になっているケースがあり、返ってきたトークンが長いと保存できずエラーになります。

観点Azure(Entra ID)起因の典型Bubble側の保存制限起因の典型
ログイン画面そもそも表示されない/即エラー表示され、認証も完了する
落ちるタイミングリダイレクト前(認可要求の段階)リダイレクト後(トークン取得・保存の段階)
エラーメッセージinvalid_client / redirect_uri_mismatch 等Text too long for this field 等の保存系
設定変更の効き方登録内容に応じて挙動が変わりやすいAzure側を直しても変わらないことが多い

重要なのは、Bubble側でこの上限を引き上げる手段が基本的にないことです。だからこそ、Bubbleフォーラム等で共有されている回避策(ワークアラウンド)を前提に、設計を「制限に当たらない形」へ寄せるのが近道になります。

なぜMicrosoft(Entra ID)のトークンは長くなりやすいのか

Microsoft Entra IDが発行するトークンは、多くの場合JWT(JSON Web Token)です。JWTは「ヘッダー」「ペイロード」「署名」をドットで連結した形式で、各パートがBase64URLでエンコードされています。つまり、中身(クレーム)が増えるほどトークン自体が長くなる構造です。

増えやすい要素具体例トークンが長くなる理由
グループ情報groupsクレーム、グループ数が多いユーザーGUIDの配列が膨らむ
アプリロールrolesクレームロール名が入る
追加クレームOptional claims(email、upn、tenant情報等)ペイロードのキー・値が増える
スコープ・同意範囲Graphの広いスコープ、複数リソース発行ポリシーによりクレームが増えることがある

このため「一部のユーザーだけ再現する」ケースもあります。たとえば、テストユーザーでは通るのに、本番の社員アカウントでは失敗する場合、本番ユーザーの所属グループやロールが多く、トークンが長くなっている可能性が高いです。

OAuthフローの選び方で安定性が変わる

BubbleでMicrosoft(Entra ID)ログインを組み込むとき、同じ「OAuth 2.0」でもフローの選び方で、トークンの扱い・保存場所・失敗しやすさが変わります。特に「User-Agent Flow(ブラウザ中心)」に寄せると、プラットフォーム側の保存仕様に引っ張られやすくなります。

項目User-Agent Flow系(フロント中心)Authorization Code Flow系(バックエンド中心)
トークンの扱いブラウザ側で受け取り、Bubbleの内蔵機構で保持されがちバックエンドでトークン交換し、保存設計を自分で決められる
長いトークンへの耐性保存先の上限に当たると詰まる保存先を工夫できるため回避しやすい
セキュリティ設計クライアント側に寄るほど取り扱いが難しい秘密情報(client secret等)をサーバー側に置ける
Bubbleでの実装難易度簡単に始められるが、制限に当たると打つ手が少ない最初は手間だが、運用まで見据えると安定しやすい

切り分けの基本:どの段階で落ちているかを3つに分解する

OAuth 2.0ログイン連携は、ざっくり次の3段階に分けると原因が見えやすくなります。

段階何が起きているか失敗時に出やすいサイン次に見るポイント
認可(Authorize)ユーザーがMicrosoftでログイン・同意redirect_uri_mismatch、invalid_clientリダイレクトURI、Client ID、テナント
トークン取得(Token)コード/トークンを受け取り、アクセストークン等を得るinvalid_grant、AADSTS系エラースコープ、Client Secret、コードの有効期限
保存・セッション化取得したトークンを保持し、以後のAPI呼び出しに使える状態にするText too long for this field保存先の制限、保持の設計

今回の「Text too long for this field」は、3段階目(保存・セッション化)で起きる代表例です。言い換えると、認可やトークン取得そのものは成功しているのに、Bubbleが保持できずに落ちている状態です。

最初にやるべき確認:トークンが返っているか、どれだけ長いかを可視化する

原因の当たりを付けるには、まず「トークンが返っているか」「返っているなら長さはどの程度か」を確認します。開発者ツールを使えば、Azure側の成否とBubble側の問題を切り分けやすくなります。

ブラウザの開発者ツールで確認する手順

  1. Chrome/Edgeの開発者ツールを開き、Networkタブを表示します。
  2. ログイン操作を最初からやり直し、login.microsoftonline.com や /token を含む通信を探します。
  3. トークンエンドポイントのレスポンスに access_token や id_token が含まれていれば、Azure側は「発行」まで到達しています。
  4. トークンをコピーし、長さをざっくり把握します(セキュリティ上、共有はしない)。

簡単に長さを確認するだけなら、開発者ツールのコンソールで次のように見られます。

// 例:トークン文字列を token 変数に入れた場合
token.length

「長いトークン=即Azure側の不具合」ではありません。多くの場合、Azureは仕様通りにJWTを返しており、受け取った側(Bubble)の保持設計が追いついていないのが本質です。

対処の考え方:Bubbleの「内蔵保存」に依存しない設計へ寄せる

Bubble側の制限が疑われるときの基本方針は次の2つです。

  • 方針A:トークンをBubble内蔵の保存機構に任せず、別の場所(自分のDB項目/外部サービス)に保管する
  • 方針B:どうしてもBubble内で完結させたい場合は、Azure側でトークンが肥大化しないようにクレームを減らす

Bubbleフォーラムで共有される回避策は、実装の表現は違っても、最終的にはこのどちらか(または併用)に収束します。

ワークアラウンドA:認可コードフローを「バックエンドで」完結させる

Bubbleのフロント(ブラウザ)でOAuthを完結させると、トークンの扱いがプラットフォーム依存になりがちです。そこで、リダイレクトで受け取ったコードをバックエンドでトークン交換し、保存もバックエンド主導にする構成にすると安定します。

手順Bubble側でやることポイント
認可URLを作るログインボタンでMicrosoftのAuthorize URLへ遷移stateを付与してCSRF対策。必要ならテナント固定
コールバックを受けるBubbleのBackend workflows(API endpoint)で code を受け取るredirect URIはこのエンドポイントに合わせる
トークン交換API Connectorを「サーバー側(Use as: Action)」で呼び出し、/token にPOSTclient_secretを使える構成(Webアプリ)なら実装が簡単
保管と更新トークンをユーザー紐づけで保存し、期限前にrefreshする保存先はプライバシールールで厳格に制御

Authorize URLとTokenリクエストの例(Entra ID v2.0)

実装イメージを掴むために、一般的なパラメータ例を載せます。実際の値は環境に合わせて置き換えてください。

Authorize(認可)の例:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
  ?client_id={client_id}
  &response_type=code
  &redirect_uri={redirect_uri}
  &response_mode=query
  &scope=openid%20profile%20email%20offline_access%20User.Read
  &state={random_state}

Token(トークン交換)の例(application/x-www-form-urlencoded):

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

client_id={client_id}
&scope=openid profile email offline_access User.Read
&code={authorization_code}
&redirect_uri={redirect_uri}
&grant_type=authorization_code
&client_secret={client_secret} 

Bubbleで組む場合、TokenのPOSTはAPI Connectorでアクション化し、Backend workflowから呼び出すと「クライアント側に秘密情報を置かない」形になりやすいです。

この構成のメリットは、Bubbleの「OAuth設定画面の制約」を避けられる点です。トークンが長くても、保存先を自分で設計できるため、エラーの土台を取り除けます。

ワークアラウンドB:トークン保管を外部に委ね、Bubbleは短いキーだけ扱う

セキュリティと運用を重視するなら、トークンをBubbleのDBにそのまま置かず、外部の安全な保管場所に寄せるのも現実的です。代表的には次のような形が考えられます。

  • 自前のAPI(Azure Functions / Cloudflare Workers など)でOAuthとトークン保管を担当し、Bubbleには短いセッションキーだけ返す
  • OAuth連携の中継サービスを利用し、トークン管理をサービス側に寄せる

Bubbleが保持するのは短い識別子だけなので、「長いトークンを保存しようとして落ちる」問題を根本から回避できます。

ワークアラウンドC:Azure側の発行内容をスリム化してトークンを短くする

外部保管が難しい場合は、Azure(Entra ID)側の設定でトークン肥大化の原因を減らすことで、Bubbleの制限に当たりにくくできます。ここは「Azureが悪い」という話ではなく、Bubble側の制約に合わせて発行内容を調整するという割り切りです。

  • グループクレームを付けない:必要なときはGraph APIで都度取得する(/me/memberOf など)
  • Optional claimsを増やしすぎない:本当に必要な項目だけに絞る
  • スコープを最小化:まずはユーザー識別に必要な範囲だけで動作確認し、段階的に増やす
  • アプリロールの設計を整理:ロール名が長い/数が多い場合は見直す

「トークンを短くする」方向は、再現条件がユーザー属性に依存するケース(特定ユーザーだけ失敗)に特に効きます。

IDトークンとアクセストークンの混同を防ぐ

Microsoft(Entra ID)連携でよくある落とし穴が、「何のためのトークンか」を曖昧にしたまま実装してしまうことです。Bubble側の保存制限に当たるときも、どのトークンを保持しているかで対処が変わることがあります。

種類用途Bubble実装での扱い方の例
IDトークンログインしたユーザーが誰かを表す(OpenID Connect)ユーザー識別だけなら、必要情報を取り出して自前ユーザーに紐づける
アクセストークンMicrosoft Graph等のAPIを呼ぶ権限を表すAPI呼び出し時だけヘッダーに付与。保存・更新の設計が重要
リフレッシュトークンアクセストークン更新用運用上必要なら保持。ただし取り扱いは最も慎重に

「ログインができればよい」のか、「Graph APIを継続的に呼びたい」のかで、必要なトークンが違います。要件に対して過剰にトークンを抱えると、保存や運用が難しくなります。

Bubble側の実装で失敗しやすいポイント

同じMicrosoft(Entra ID)OAuth連携でも、Bubbleの実装次第でハマりどころが変わります。次のチェックリストを潰すと、調査が一気に進みます。

チェック項目ありがちなミス改善の方向性
リダイレクトURIBubble側のURL末尾スラッシュ違い、環境(dev/prod)混在Azure側に完全一致で登録。環境ごとに分ける
エンドポイントの選択v1とv2が混在し、パラメータ(resource/scope)が噛み合わない基本はv2で統一し、scopeで設計する
スコープ設計最初から大きく取りすぎて、動作確認が難しくなる最小スコープ→段階的に増やす
保存設計Bubble内蔵のOAuth保存に依存し、トークン肥大化で落ちるバックエンドで交換・保存する、または外部保管に寄せる
プライバシールールトークンをUserに保存したが閲覧権限が緩いトークン関連フィールドは原則サーバー専用にする

再現しないテストユーザーで「成功」と判断しない

この問題は、テストユーザーでは発生せず、本番ユーザーで突然発生することがあります。理由はシンプルで、ユーザーごとにトークンの中身(クレーム)が違うからです。

  • テストユーザー:所属グループが少ない、ロールが少ない、クレームが少ない → トークンが短め
  • 本番ユーザー:所属グループが多い、ロールが多い、追加クレームが多い → トークンが長くなりやすい

そのため、検証では「権限が強いユーザー」「グループが多いユーザー」でも試し、失敗するなら早めに回避策へ舵を切るのが安全です。

どうしても解決しない場合に、サポートへ渡すと調査が早い情報

回避策を試しても改善しない場合は、Azure側・Bubble側のどちらにボトルネックがあるかを、より具体的に調査する必要があります。その際、次の情報が揃っているとやり取りがスムーズです(秘密情報は共有しない)。

  • Azure(Entra ID)のテナント種別(シングル/マルチ)と、アプリ登録のClient ID(Application ID)
  • 設定しているリダイレクトURIの一覧(開発/本番)
  • 認可要求(Authorize)のURL例(client_secretやトークンは含めない)
  • tokenエンドポイントが返している項目(access_token / id_token / refresh_token の有無)
  • 発生するユーザーの特徴(グループ数が多い、特定のロールを持つ等)
  • Bubble側で利用している方式(API ConnectorのOAuth、プラグイン、独自実装)
  • エラー発生のタイムスタンプと、ブラウザ種別(Chrome/Edge)

特に「トークンは返ってきているのに、Bubbleが保持できずに失敗している」状況を示せると、原因特定が一気に進みます。

まとめ:トークン取得の前後で落ちるなら、まずBubble側の保存制限を疑う

Microsoft(Entra ID)のOAuth 2.0ログイン連携で「Text too long for this field」が出るとき、最初に疑うべきはAzureの設定ミスではなく、Bubble側が長いトークン(JWT)を保存しきれない設計になっていることです。Bubble側で上限を引き上げられない以上、トークンの扱いを変える(バックエンドで交換・保存する/外部に保管する)か、発行内容をスリム化して短くする方向で対処すると、再現性の高い解決につながります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次