【Service Account認証】GASからAPIを呼び出すとHTTP 500エラーが発生

pinetailst_bw

16:35既読 8

お世話になります。 Google Apps Script (GAS) からService Account認証を利用してBotのAPIを呼び出そうとしていますが、アクセストークン取得の段階でHTTP 500エラーが発生し、解決できず困っております。

## 概要

  • 目的: Gmailに特定のメールが届いたら、GASをトリガーにしてLINE WORKSのグループにBotからメッセージを自動送信したい。

  • 認証方式: Service Account認証

## 問題

  • GASから POST https://auth.worksmobile.com/oauth2/v2.0/token にリクエストすると、HTTP 500 Internal Server Errorが返ってきます。

  • エラーは100%発生します。

## こちらで確認済みのこと

  1. 認証情報: Client ID, Client Secret, Service Account ID, Bot ID は、Developer Consoleの表示とGAS上のコードが完全に一致していることを何度も確認済みです。

  2. 秘密鍵: Private Keyもコピー&ペーストが正しいことを確認済み。さらに、一度再発行して新しいキーで試しましたが、状況は変わりませんでした。

  3. 権限(Scope): アプリの「OAuth Scopes」でbotおよびbot.messageにチェックが入っていることを確認済みです。

  4. Botの設定: Botの公開設定は「全体公開」、Botポリシーは「グループに招待可」に設定済みで、実際にグループへの招待も完了しています。

  5. コードの修正: トークン取得時のpayloadからclient_secretを削除するパターンも試しましたが、同じ500エラーでした。

## 質問

  • 上記をすべて試した上で、他に考えられるHTTP 500エラーの原因はありますでしょうか?

  • LINE WORKSの特定のプランや環境、またはアカウント設定に依存する問題の可能性はありますでしょうか?

  • 同様の現象に遭遇し、解決された方がいらっしゃいましたら、知見をお貸しいただけないでしょうか。

## コード(トークン取得部分)

JavaScript
function getAccessToken() {
  const header = { alg: 'RS256', typ: 'JWT' };
  const now = Math.floor(Date.now() / 1000);
  const payload = {
    iss: CLIENT_ID,
    sub: SERVICE_ACCOUNT,
    iat: now,
    exp: now + 3600,
  };

  const signature = Utilities.computeRsaSha256Signature(
    Utilities.base64EncodeWebSafe(JSON.stringify(header)) + '.' + Utilities.base64EncodeWebSafe(JSON.stringify(payload)),
    PRIVATE_KEY
  );

  const jwt =
    Utilities.base64EncodeWebSafe(JSON.stringify(header)) + '.' +
    Utilities.base64EncodeWebSafe(JSON.stringify(payload)) + '.' +
    Utilities.base64EncodeWebSafe(signature);

  const tokenUrl = 'https://auth.worksmobile.com/oauth2/v2.0/token';

  const params = {
    method: 'post',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    payload: {
      assertion: jwt,
      grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      client_id: CLIENT_ID,
      scope: 'bot'
    },
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(tokenUrl, params);
  const result = JSON.parse(response.getContentText());
  // 以下、実行ログで500エラーを確認
}

非常に長く、困難な道のりになってしまい、最終的に私では解決できず、本当に申し訳ありません。このコミュニティ投稿で、何か進展があることを心から願っています。

コメント0

次の投稿Richmenuでアップロード制限が出る,それをクリアしてもFileIdが無効といわれる
リスト

まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。