ITインフラエンジニアのおつむの整理

ITインフラエンジニア(現ニート)の頭の整理場所。ほぼ日記になる予定。

clasp login --no-localhostができない

背景

Gmailの自動整理としてGAS(Google Apps Script)を使用しているのですが、せっかく最近Gitを覚えたしGitで管理できるようにしたいと思ってました。 調べてみるとclaspという環境を使用すると、CLIからGASを管理できるようになるとのこと。 ではDockerで環境構築して管理してきますか!と意気込んてたのですが、一番最初のloginの段階でうまくいかない状態です。

Dockerfile

FROM node:slim
RUN npm i @google/clasp -g
CMD ["/bin/bash"]

以下を参考にさせてもらってます。 gasを管理するclaspのdocker環境を作成する - Qiita

build/run/clasp login実行

実行したのが以下です。

# docker build . -t clasp:latest
Sending build context to Docker daemon  4.096kB
Step 1/3 : FROM node:slim
 ---> 72150548d9e3
Step 2/3 : RUN npm i @google/clasp -g
 ---> Running in 7474b17f5cfb

added 264 packages, and audited 265 packages in 20s

80 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New major version of npm available! 8.19.3 -> 9.1.1
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.1.1>
npm notice Run `npm install -g npm@9.1.1` to update!
npm notice
Removing intermediate container 7474b17f5cfb
 ---> 4670be7b9b25
Step 3/3 : CMD ["/bin/bash"]
 ---> Running in cd1277eb5550
Removing intermediate container cd1277eb5550
 ---> 0c90541ed382
Successfully built 0c90541ed382
Successfully tagged clasp:latest
# docker run -it clasp
root@7bad27bd043e:/# clasp login --no-localhost
Logging in globally…
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.deployments%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.projects%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.webapp.deploy%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fservice.management%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Flogging.read%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&response_type=code&client_id=1072944905499-vm2v2i5dvn0a0d2o4ca36i1vge8cvbn0.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob

Enter the code from that page here: 

ここまできたらあとは表示されたURLにアクセスして許可したら表示されるコードを入力すればよいはずなのですが、アクセスしたURLでは以下のような画面が。

claspLogin後の画面

はて。Google Apps Script APIもちゃんと事前にONにしてます。 また上記ログで表示されているnpm install -g npm@9.1.1もあとでDockerfileに追記して実行してみても同じ結果です。

試しに--no-localhostのオプションを外して実行してみると何やら成功しそうな画面が表示されます。 ただしこれはclaspを実行した環境でGUIが使用できる場合のコマンドのため、そのまま許可しようとしてもhttp://localhost:<port>/?code=xxxxxxxxxxxxxxxのURLに飛ばされるため失敗します。

claspLogin(成功)

エラー内容確認

このまま試行錯誤しても解決しなさそうなので、諦めてエラー内容などを詳細に確認してみます。 まずはエラーの詳細を読んでみます。

エラーの詳細

oobなんちゃらがブロックされていると。関連するデベロッパードキュメントとやらもざっと読んでみます。 影響を受けているかどうかの確認アプリが OOB フローを使用しているかどうかを判断する方法アプリケーション コードを調べる

Google OAuth 認証エンドポイントを呼び出すアプリケーション コードのセクションを確認し、redirect_uri パラメータに次のいずれかの値があるかどうかを確認します。
・redirect_uri=urn:ietf:wg:oauth:2.0:oob
・redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
・redirect_uri=oob

アクセス先のURLの末尾がredirect_uri=urn:ietf:wg:oauth:2.0:oobになってますね。これか。。。 問題っぽいのはわかったのですが、ではどうすればいいのかと、サンプルリクエストを見てみると

https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

clasp触ったばかりだから全然わからーん、とめげつつURLにScopeとClientIDは記載されてますね。おそらくScopeが許可するサービス、ClientIDはClaspを示すものなんだと思います。あとStateはなんなんじゃ。

と色々調べてたら、この事象についてGithubでissuesになってるっぽい。なので改善されるまで保留かな、ってなってます。てか今記載しながら思ったけど、サンプルクエリだし、State無し版でURLにアクセスすればいいのか??

clasp login --no-localhost No Longer Working · Issue #948 · google/clasp · GitHub

※20221116追記 ↑アクセスするURLを編集すればどうこうできるものではなかったですね、、、