clasp login --no-localhost を使いたい
docker環境でclaspを使っていたがターミナルからコマンドでログインできなくなった
シェルスクリプトでログイン処理をまとめていたのでその内容をメモ
結論から言うと、clasp login --no-localhostの代わりにclasp loginを実行してブラウザで表示されるURLにcurlでアクセスするとログインできます
同じ環境のターミナルを別に開く必要があります
面倒臭いです
該当するソースコード
clasp login --no-localhost
発生している問題・エラー
アクセスをブロック: clasp – the apps script cli のリクエストは無効です
これはclasp login --no-localhostを実行して出力されたURLにブラウザからアクセスしたときに表示されるエラーですが面倒なので画像は貼りません
googleのドキュメントなどをみると
OAuth out-of-band (oob) flow will be deprecated
という項目などがあり、自分が対象なのか調べる方法としてURLにoobが含まれるか確認するというのがありますが、自分の場合も該当しました
ざっとしか読んでませんが解決方法はとくになくclasp login --no-localhostはもう使えないということみたいです
自分で試したこと
調べたところ、そもそも仮想環境ではなくローカルPCでclasp loginするとできるらしいです
開発環境を作業者間で統一するためにdockerを使っているので試してません
仮想環境でclasp loginするとclasp login --no-localhost と同様にURLが出力されますが、アクセスするといつもの認証画面がでます
そのあと通常なら
ブラウザ側では、認証が終わった段階でブラウザ上にコードが表示される。
それを待機していたコマンドラインのEnter the code from that page here:
の後ろに貼り付ければ、認証完了。
となりますが、clasp loginだとコードは表示されず無効なURL(localhost:***)に遷移します
さらに調べたところ、実はこのURLにcurlでアクセスするとログインできるらしいです
ただしclasp loginを実行したターミナルは入力を受け付けない状態になるので、同じ環境のターミナルを別に開く必要があります
別のターミナルで
curl localhost:***
とすると、元のターミナルでとまっていた処理が再開します
最終的にsuccessful.となればOKです
別のターミナル開くのとか、それを説明するのも大変なのでがんばりました
#!/bin/bash -eu
RUNNING_MODE=$1
cd $(dirname $0)
#設定ファイルから変数を取得
source ./env/claspConfig.text
# login先を明示的に設定
if [[ $RUNNING_MODE = dev ]]; then
# login先を開発環境に変更
SCRIPT_ID=$SCRIPT_ID_DEV
elif [[ $RUNNING_MODE = prod ]]; then
# login先を本番環境に変更
SCRIPT_ID=$SCRIPT_ID_PROD
else
echo 'usage: ./login.sh <dev|prod>'
exit 1
fi
# 設定を反映
echo '{"scriptId":"'$SCRIPT_ID'"}' > .clasp.json
# 仕様変更でclasp login --no-localhostが使えなくなった
echo '出力されたURLにブラウザでアクセスして、フローに従って許可してください。最後に遷移するURL(localhost:***)をコピーしてINPUT_URL_STR: にペースト、エンターしてください。'
# バックグランドでlogin処理を継続させて次の処理を行う
{
clasp login
} &
# スリープで表示順を調整する
sleep 3
#プロンプトをechoを使って表示、
echo -n INPUT_URL_STR:
#入力を受付、その入力を「str」に代入
read str
#結果を表示
curl $str
# バックグラウンドのログイン処理が完了したら次の処理をする
wait
echo 'login to' $RUNNING_MODE
# 開発環境に戻す
SCRIPT_ID=$SCRIPT_ID_DEV
echo '{"scriptId":"'$SCRIPT_ID'"}' > .clasp.json
echo 'scriptId changed to dev'
これで bash ./login.sh prod などと打つと clasp login --no-localhost のときと同じように実行できるようになりました
開発環境と本番環境の設定もそのままのせましたが気にしないでください
バックグラウンドとsleepの処理だけ書けばひとつのターミナルで動くと思います