外部からAPIでアクセスする際のセキュアアクセス対応方法を教えてください

添付ファイル付きのGmailメッセージをkintoneに自動的にアップロード

を参考に、Gmailをkintoneに追加することを考えています。

(添付ファイルは不要だったのでその部分は削除しました)

開発者環境ではうまくレコード作成してくれたのですが、本番環境ではうまくいきません。

Response code is "400.0"と出まして、クライアント証明書を利用したセキュアアクセスを利用しているためと考えております。

クライアント証明書の認証情報を入れるのだと思いますが、どのように入れるかが分かりません。

どなたか分かる方はご教授いただけないでしょうか。

'use strict';
const domain = "xxxx.s.cybozu.com";
const appId = 00x;
const apiToken = "xxxxxx";
const appName = "xxx";

// 検索条件に合った受信メールを取得する
function getGmailMessage() {
//指定した件名で未読メールのみ取得
  const threads = GmailApp.search('is:unread subject:(お問い合わせフォームより)');

  const recordObjs = [];
  for (let i = 0; i < threads.length; i++) {
    const messages = threads[i].getMessages();// Get messages
    for (let j = 0; j < messages.length; j++) {
      const recordObj = {};
      const message = messages[j];
      if (message.isUnread()) { // スレッド内の未読メールのみ対象

        //メール本文から情報抽出
            var str=message.getPlainBody();
            
            var SP=[];
            SP=str.split('会社名');

            var temp=SP[1];
            SP=[];
            SP=temp.split('お名前');
            var Customer=SP[0];

            temp=SP[1];
            SP=[];
            SP=temp.split('メールアドレス');
            var Name=SP[0];

            temp=SP[1];
            SP=[];
            SP=temp.split('電話番号');
            var mailadress=SP[0];

            temp=SP[1];
            SP=[];
            SP=temp.split('お問い合わせ内容');
            var phonenumber=SP[0];

            temp=SP[1];
            SP=[];
            SP=temp.split('-----');
            var Detail='【ホームページ問い合わせ】'+SP[0];

        // メールの送信者
        recordObj.Customer = {value: Customer};
        // メールの送信者
        
        recordObj.Name = {value: Name};
        // 送信元メールアドレス
        recordObj.mailadress = {value: mailadress};
        // メールの件名
        recordObj.phonenumber = {value: phonenumber};
        // メールの本文
        recordObj.Detail = {value: Detail};
        //必須項目の初期値をその他に指定
        recordObj.QType={value:"その他"};

        // 既読にする
        message.markRead();
      }
      recordObjs.push(recordObj);
    }
  }
  return recordObjs;
}

function sendToKintone() {
  const apps = {
    YOUR_APPLICATION1: {
      appid: appId,
      name: appName,
      token: apiToken,
    }
  };

  const manager = new KintoneManager.KintoneManager(domain, apps);
  const records = getGmailMessage();

  // recordsにメールの情報が取得できた場合にのみkintoneにPOSTする
  if (records.length > 0) {
    const response = manager.create('YOUR_APPLICATION1', records);
    // 成功すればcodeに200が返る
    const code = response.getResponseCode();
    Logger.log('Response code is "%s"', code);

  } else {
    Logger.log('No record found');

  }
}

ヘルプページを見る限り、クライアント証明書関係でエラーが出る場合、496になると思われます。

400が出るのはリクエストボディの問題も考えられる(不正なJSON文字列)ので、

    const response = manager.create('YOUR_APPLICATION1', records);
 Logger.log('response=>"%s"', response);

一度responseをログに出してみると何か分かるかもしれません。

https://cybozudev.zendesk.com/hc/ja/articles/4977994758297-kintone-JavaScript-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%BE%E3%81%A8%E3%82%81#check-the-network

通信時の状況についてはこちらでも確認できますので必要に応じてぜひ

mls-hashimotoさま

ありがとうございます。参考になります。

responseを確認したところ、クライアント証明書についてのエラーのhtmlファイルが出力されました。(以下は画像ファイルですが、内容は同じです)

やはりクライアント証明書の添付が必要かと思います。

 

村濱一樹 さま

ありがとうございます。

GAS経由だとrecord.jsonの形の通信で出ないようで、どれをどう見れば良いか分かりませんが、赤文字表示が出ないのでエラーは出てないのではという気がしています。

このあたりも不勉強なので、もう少し勉強してみます。

ああ、すいません:bowing_woman:
外部APIをGASからたたく、ということであれば僕の提案のものはできないことです!
ご放念ください、失礼しました!!

セキュアアクセスを利用してる場合、外部APIサーバーのIPアドレスをアクセス制限の設定で追加すれば良いのかなーと思いました。

細谷様

ありがとうございます。いただいたコメントを読んでいて、わざわざ証明書での認証をしなくてもBasic認証経由でいけるかもと思い立ち、Basic認証を通るように改変したところ、無事できました。

セキュリティ的にそれで良いのかはよく分かりませんが。

ありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。