かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Proxy 設定されている社用マシンで Firebase ログインが大変だったメモ

お手伝いしているプログラミングスクールで Firebase を使う講義の際に Proxy 設定がされている社用 PC の方の環境で盛大にハマりどころがあったのでメモ。
Windows 環境は扱った経験がないので適当な記述になっているかと思います。ご了承ください。

1. npm install firebase-tools ができない

$ npm i -g firebase-tools
npm ERR! code ENOTFOUND
npm ERR! syscall getaddrinfo
npm ERR! errno ENOTFOUND
npm ERR! network request to https://registry.xxxxxx.com/firebase-tools failed, reason: getaddrinfo ENOTFOUND registry.xxxxxx.com
npm ERR! network This is a problem related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

エラーが長いですが注目すべきポイントは下記です
npm ERR! network request to https://registry.xxxxxx.com/firebase-tools failed, reason: getaddrinfo ENOTFOUND registry.xxxxxx.com

npm でアクセスするレシストリが独自のものに変更されているのが原因

社用 PC だからかレジストリが独自のものが設定されていました…

# npm の設定確認
$ npm config list -g
# 略
registry = "https://registry.xxxxxx.com/"
# 略

registry が https://registry.npmjs.org/ 以外になっていると別の所にアクセスしてしまいます。

1-1. config の registry 設定を修正する

global インストールが必要な場合は global の設定を修正せざるを得ないかなと思います。

# registry を変更する
$ npm config set registry https://registry.npmjs.org/

1-2. 現在のプロジェクトで registry 設定を変更する

.npmrc があるとそちらの設定が使われるので、プロジェクトに .npmrc を作成してそこに registry の設定を作成する

.npmrc

 registry=https://registry.npmjs.org/

現在のプロジェクトのレジストリの確認

$ npm config ls -l
# 略…
; registry = "https://registry.xxxxxx.com/" ; overridden by project

; "project" config from /Users/kikiki/my-project/.npmrc

registry = "https://registry.npmjs.org/"

registry が https://registry.npmjs.org/ になっていれば OK


2. firebase コマンドが実行できない

社用 PC PowerShell の方の環境で発生しました

> firebase login
firebase : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\...\npm\firebase.ps1 を読み込むことができません。

PowerShell の実行権限の問題

PowerShell にはプログラムの実行権限 (ポリシー)があるらしく、プログラムを自由に実行できない権限になっていると このシステムではスクリプトの実行が無効になっているため というエラーが出るようです。

権限を確認して Restricted なら RemoteSigned に変更する

## 現在のポリシーを確認
> Get-ExecutionPolicy 
Restricted
## Restricted になっているとインストールしたコマンドを実行できないので変更する
## 現在のプロセスを RemoteSigned ポリシーに変更
> Set-ExecutionPolicy RemoteSigned -Scope Process
## ポリシーの確認
> Get-ExecutionPolicy
RemoteSigned
ポリシー 内容
Restricted 構成ファイルの読み込みやスクリプトの実行を行いません。既定値は "Restricted" です。
AllSigned すべてのスクリプトと構成ファイルが信頼された発行元によって署名されていることを要求します (ユーザーがローカル コンピューターに書き込むスクリプトを含む)。
RemoteSigned インターネットからダウンロードされたすべてのスクリプトおよび構成ファイルが、信頼された発行元によって署名されていることを要求します。
Unrestricted すべての構成ファイルを読み込み、すべてのスクリプトを実行します。インターネットからダウンロードされた署名されていないスクリプトを実行する場合、スクリプトを実行する前に確認を求められます。
Bypass 何もブロックされず、警告もメッセージも表示されません。
Undefined 現在のスコープから現在割り当てられている実行ポリシーを削除します。このパラメーターは、グループ ポリシー スコープ内で設定された実行ポリシーは削除しません。

cf. 実行ポリシーの設定値について


3. firebase login で Failed to make request to のエラーが発生する

$ firebase login
i  Firebase optionally collects CLI usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you.

? Allow Firebase to collect CLI usage and error reporting information? (Y/n) 
Error: Failed to make request to https://firebase-public.firebaseio.com/cli.json

👉 エラーが発生して落ちる。Error: Failed to make request to https://firebase-public.firebaseio.com/cli.json
firebase からのアクセスが遮断されているっぽい。今回のケースでは社用 PC に設定された Proxy が弾いていたっぽい

Proxy の設定を行い TLS接続の証明書検証を無効化する

生徒さんのターミナルの環境が異なっていてコマンドが異なるから大変だった…

3-1. Proxy の設定

Mac bash / zsh

$ export HTTP_PROXY=http://${username}:${password}@${proxyhost}:${port}
$ export HTTPS_PROXY=http://${username}:${password}@${proxyhost}:${port}

Windows ターミナル

$ set HTTP_PROXY=http://${username}:${password}@${proxyhost}:${port}
$ set HTTPS_PROXY=http://${username}:${password}@${proxyhost}:${port}

Windows PowerShell

> $env:http_proxy="http://${username}:${password}@${proxyhost}:${port}"
> $env:https_proxy="http://${username}:${password}@${proxyhost}:${port}"

3-2. TLS接続の証明書検証の無効化

⚠ 自分の環境ではなかったので、この設定も確実に必要なのかは検証できていません

NODE_TLS_REJECT_UNAUTHORIZED=value
If value equals '0', certificate validation is disabled for TLS connections. This makes TLS, and HTTPS by extension, insecure. The use of this environment variable is strongly discouraged.
cf. Command-line API | Node.js v18.7.0 Documentation

あまり推奨されるものではないので環境変数を設定して一時的に無効化する

Mac bash / zsh

$ export NODE_TLS_REJECT_UNAUTHORIZED=0

Windows ターミナル

$ set "NODE_TLS_REJECT_UNAUTHORIZED=0"

Windows PowerShell

> $env:NODE_TLS_REJECT_UNAUTHORIZED=0

毎回この設定を使ってるターミナルでやっておいてね。とするのは大変なので設定ファイルとかで自動的に設定を読み込ませるようにできるのが良さそうです。

所管

今回は生徒さんが所謂プログラム未経験で、それぞれが持ってきたマシンで環境が Mac / Windows の両方があり、その上それぞれのターミナルが bash だったり zsh だったり コマンドプロンプト だったり PowerShell だったりと分かれていて生徒さん自身がそれらの違いを認識していない / 違いを知らないという状況だったので、人によってはできるのにこちらの人ではできないという地獄絵図が発生してしまいました。
さくっとできるを体験するには Firebase はとても良いのですが、授業のような場で使うには最低限の基礎知識がある又は環境を揃えておくのが良さそうに思いました。

ぼくもよくハマるのですが、調べまくって何とかする習慣がいつの間にか身についているのですが自分の知識が浅い環境周りでハマるとホント辛い思いをするし未経験でスクールに来た人は心折れちゃいそう〜って感じました。 環境が揃ってないスクールそれはそれで大変ですね…

おわり


[参考]