GASとLambdaを使い、音声UI Alexaのカスタムスキル を作成しているのですが、GASのアクセス範囲の制限の仕方でわからなくなってしまったので質問です。
どれも初めて使ったもので、このような質問の場も初めてなので、説明に足りない部分があったら教えていただけると嬉しいです。
#疑問点
特定のLambdaからのみGASにアクセスできるようにする方法
#作りたいもの
今作っているのは、「Alexa、●●さんの予定教えて」と聞くと、その名前の人の予定をとってきてくれるスキルを作っています。参考にしているのはこのサイトです。http://azure.sios.jp/archives/8450
うまく質問を短文にできないので、流れを追いながら質問させてください。
#今やっていること
スキルの簡単な動きの流れとしては、
- 話しかける「Alexa、田中さんの予定教えて」
- Lambdaに名前が渡される
- LambdaがGASを呼ぶ
// Google Apps Scriptで導入した後に表示されたURL(現在のWebアプリケーションのURL)を // 設定します。 const uri = 'WebアプリケーションのURL' + '?name=' + name; // Google Apps ScriptのRest APIにアクセスして、JSONを取得する関数を呼びます。 getHttp(uri,this);
4. GASが名前をゲットし、カレンダーにアクセスする
function doGet(e) { // クエリパラメーター「name」で指定された、Googleカレンダー取得対象のユーザーの名前を取得する。 var name = e.parameter.name; // ユーザーが発話した名前(「〇〇さんの今日の予定を教えて」の〇〇の部分)に紐づく // メールアドレスを定義する。Googleカレンダーの予定を取得する際は、 // そのキーにメールアドレスを指定しなければならないので、この変換が必要になる。 var mail = {}; mail['たなか'] = 'たなかのgmailのアドレス'; mail['やまだ'] = 'やまだのgmailのアドレス'; // 指定したユーザーのGoogleカレンダーの予定を取得する。 var cal = CalendarApp.getCalendarById(mail[name]); // 現時点のDateを生成する var nowDate = new Date(); // 今日の日付の00:00:00時点のDateを生成する var startDate = new Date(nowDate); startDate.setHours(0); startDate.setMinutes(0); startDate.setSeconds(0); // 今日の日付の23:59:59時点のDateを生成する var endDate=new Date(startDate); endDate.setHours(23); endDate.setMinutes(59); endDate.setSeconds(59); // 今日一日のGoogleカレンダーの予定を取得する var myEvents=cal.getEvents(startDate,endDate); // 今日一日のGoogleカレンダーのJSONを生成する。 var body = ''; num = 0; var result = []; var fullTitle = ''; var evtTitle = ''; for each(var evt in myEvents){ result[num] = { start: convertDate(evt.getStartTime()), end: convertDate(evt.getEndTime()), place: evt.getLocation(), title: evt.getTitle() } num++; } } } return ContentService .createTextOutput(JSON.stringify(result)) .setMimeType(ContentService.MimeType.JSON); } function convertDate(date) { //moment.jsで日付の形式を合わせる(上記コメントアウトとやってることは一緒。便利) return Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm:ss'); } function toDoubleDigits(num) { num += ""; if (num.length === 1) { num = "0" + num; } return num; }
5. GASでカレンダーをもとに予定を検索。JSON形式にしてLambdaに返す
6. Lambdaが受け取ったJSONデータをもとに予定を喋る
と言った感じです。
#以上を踏まえてわからないこと
上の3の部分でLambdaがGASを利用できるよう、GASのアプリケーションにアクセスできるユーザーは、全員(匿名含む)にしています。
ですが、このままだと誰でもカレンダーの情報にアクセスできてしまいセキュリティ上よろしくないので、Lambdaから呼ばれた時だけアクセスできる的な制限・認証処理か何かを追加したいと思っています。
最初はアプリケーションにアクセスできるユーザーの範囲を狭くすればいいかな?と思いましたが、全員(匿名含む)でなければAlexa(Lambda)からGASを呼べないとわかり断念。
OAuth認証というものを使えばできるのかと思い調べてみましたが、仕組みや使い方がわからず困っています。
読みづらくなっておりすみません。
どなたかお力添えいただけると嬉しいです。よろしくお願いします。
あなたの回答
tips
プレビュー