さて、今回はGASでBASIC認証をパスして、APIにJSONをPOSTする方法です。
BASIC認証って何って方から、GASでbasic認証をパスする必要が出てきた(内部エンジニアが作った簡易APIを叩きたい時とか)、みたいな状況の方を対象にして解説していきたいと思います。
BASIC認証とは?
ベーシック認証(Basic認証)とはWebサイトの特定の領域、つまり特定のディレクトリ(ページ)やファイルにアクセス制限をかけることができる認証方法の1つです。
Webサイトを運用したことがあれば、一度はお目にかかることがあるかと思いますが、ポップアップが出てきて、IDとパスワードを求められるあれです。
ググると画像がいっぱい以下のように出てきます。

BASIC認証の作成方法
それでは別にノンプロが理解する必要はないのですが、少しだけBASIC認証の裏側も解説していきます。これが、わかれば、裏側の動作がわかり、この後説明するGASでの書き方の概要が理解し易くなるかと思い。
BASIC認証の基本
設定方法は非常に簡単で、サーバーに「.htaccess」ファイルと「.htpasswd」ファイルを作成して、それぞれのファイルに必要記述を行っていくだけです。
2つのファイルで設定が終わるということは、簡単に実装できるということでもあり、他方で、セキュリティ的にそれほど複雑なことはしにくい(シンプル=セキュリティが単純に弱いというのはちょっと語弊もありますが)ということも言えます。
サーバ側の動作
クライアントから、リクエストを受けたサーバでは、基本的に以下の流れで処理がなされています。
- step1クライアントからリクエストを受け取る
- step2リクエスト内容をdecodeする
- step3デコードした要素が、htpasswdファイルに定義された、ID・PASSWORDと一致しているかを検証
要は、リクエスト内容をデコードして、htpasswdファイルの登録内容と一致を確認して、OKであれば、認証するという流れです。この流れを頭に入れておくと、リクエスト側の実装も楽です。
htaccessファイル
イメージとしては、誰に認証をどの方式で求めるかを定義するファイルという感じです。ちょっと語弊もありますが。。
こちらには、以下の4つの要素を記述していきます。
AuthType 認証方式を宣言
AuthName 認証時に表示される文言を指定
AuthUserFile htpasswdをフルパスで指定
require .htaccessに記載されたIDのうち認証を求めるユーザーを指定
AuthTypeには、BasicとDigestの2パターンがあり、BASIC認証を利用する場合は、BASICを指定します。digest認証ってのもググってもらうと何かわかるかと思います。
requireは大概valid-userを指定して、パスワードファイルに指定されるユーザ全てに認証を求めるようにしています。
htpasswdファイル
こちらは名前の通り、passwordを設定するファイルです。
[ユーザー名1]: [暗号化されたパスワード1]
[ユーザー名2]: [暗号化されたパスワード2]
ユーザ名とパスワードがセットになって登録されていて、このファイルをhtaccess側で指定して読み込んでいます。
GASでのリクエスト方法
では、本題のリクエスト方法についてみていきましょう。
サンプルコード
先に出しておくと、ざっとこんな感じで処理可能です。
function basicauth_request() {
const ID = PropertiesService.getScriptProperties().getProperty("ID");
const PASS = PropertiesService.getScriptProperties().getProperty("PASS");
const url = "URL";
let body = {
"POSTしたい内容"
}
let option={
'method': 'POST',
'contentType': 'application/json; charset=utf-8',
"payload": JSON.stringify(body),
headers: {"Authorization" : " Basic " + Utilities.base64Encode(ID + ":" + PASS)}
}
UrlFetchApp.fetch(url,option);
}
BASIC認証リクエストの解説(簡易)
では、少しだけ解説を入れていきます。
optionのheadersについて
ここが、BASIC認証をパスするための肝となります。
以下の要素が含まれています。
最後のbase64Encodeしている理由が、先ほど説明したサーバ側でdecode処理が実施されるからです。
まとめ
今回は、【GAS BASIC認証をパスしてJSONをPOSTする方法】として、GASでBasic認証をパスしてJSONをPOSTする方法を紹介しました。
ユースケースははてなとかのAtomとかくらいか、もしくは内部APIを叩く時くらいに限られるかもしれませんが、まぁエンジニアと内部連携する時にはよく利用しますので、知っておいても損はないかなと思います。
では、また。