【Firebase】認証ファイルをDLしないでadmin sdkを実行する方法

# やりたい事
**秘密鍵(jsonファイル)をDLしない**でFirebase Admin SDKを実行させたい。

※秘密鍵はここからDLするjsonファイルの事。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878112/03a29482-ead7-05af-6b1e-bd53642182b5.png)

# 前提
- google cloud sdkがダウンロード済みである事


# 要点

設定情報を確認する。
```
$ gcloud config list
```

プロジェクトの一覧を確認する。
```
$ gcloud projects list
```

プロジェクトを設定 / プロジェクトの切り替え。
```
$ gcloud config set project {your-project-id}
```

アプリケーションデフォルト認証
```
$ gcloud auth application-default login
```

プロジェクトの切り替え後、認証情報を更新する
```
$ gcloud auth application-default set-quota-project {your-project-id}
```



# 実施メモ
gcloudをダウンロードした直後の状態を確認。予想通り空。
```
>gcloud config list
[accessibility]
screen_reader = False
[core]
disable_usage_reporting = True

Your active configuration is: [default]
```

一先ず、ログインをしてみる。
```
>gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?......

You are now logged in as [{your-email}].
Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

```

ちゃんと追加出来ていそうですね。
```
>gcloud config list
[accessibility]
screen_reader = False
[core]
account = {your-email}
disable_usage_reporting = True

Your active configuration is: [default]
```

設定構成が見られるらしい。今はどうでも良さそう。
```
>gcloud config configurations list
NAME     IS_ACTIVE  ACCOUNT       PROJECT  COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       {your-email}
```

プロジェクトの設定が抜けていた為、設定しておく。
```
>gcloud config set project {your-project-id}
Updated property [core/project].
```

追加出来ている。
```
>gcloud config configurations list      
NAME     IS_ACTIVE  ACCOUNT       PROJECT       COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       {your-email}  {your-project-id}

>gcloud config list   
[accessibility]
screen_reader = False
[core]
account = {your-email}
disable_usage_reporting = True
project = {your-project-id}

Your active configuration is: [default]

```

## python準備
```
pip install --user firebase-admin
```

いまのままでは動かない
※間は端折っています。
※gpt君に生成してもらいました。
```
import firebase_admin
from firebase_admin import credentials, firestore

# Firebase Admin SDKの初期化
firebase_admin.initialize_app()

db = firestore.client()

collection_name = "test-collection"

def get_user(doc_id):
    doc_ref = db.collection(collection_name).document(doc_id)
    doc = doc_ref.get()
    if doc.exists:
        print(f"User data: {doc.to_dict()}")
    else:
        print("No such user found.")

if __name__ == "__main__":
    get_user("id")

```

pythonを実行
```
>py read-test-collection.py
google.auth.exceptions.DefaultCredentialsError: Your default credentials were not found. To set up Application Default Credentials, see https://cloud.google.com/docs/authentication/external/set-up-adc for more information.
```

どうやら認証が上手くいっていなかった。
※記事を書いている時に気が付いたが結局ここに保存されているようですね。
　[C:\Users\{user}\AppData\Roaming\gcloud\application_default_credentials.json]

```
>gcloud auth application-default login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?.....


Credentials saved to file: [C:\Users\{user}\AppData\Roaming\gcloud\application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

Quota project "{your-project-id}" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.    
```

一応何か変わっているか確認。変化なし。
```
>gcloud config list
[accessibility]
screen_reader = False
[core]
account = {your-email}
disable_usage_reporting = True
project = {your-project-id}

Your active configuration is: [default]
```

もう一度pythonを実行。できた！
```
>py read-test-collection.py
User data: {'id': 'db1'}
```

## 切り替え
プロジェクトを他のものに切り替えてみる。
```
>gcloud config set project {new-your-project-id}
WARNING: Your active project does not match the quota project in your local Application Default Credentials file. This might result in unexpected quota issues.

To update your Application Default Credentials quota project, use the `gcloud auth application-default set-quota-project` command.
Updated property [core/project].
```

しかし、上手くいっていなさそう？翻訳するとクレデンシャルを更新する必要があるらしい。
今回自分のアカウントとは別のアカウントのDBを使う為、その影響かも？
推奨されたコマンドを実行する。
```
>gcloud auth application-default set-quota-project {new-project-id}
```

projectの所が変わっている事が確認出来た。
```
>gcloud config list
[accessibility]
screen_reader = False
[core]
account = {your-email}
disable_usage_reporting = True
project = {new-project-id}

Your active configuration is: [default]
```

同じpythonコードを実行してみると、、、。
切り替えが出来ていた。やったね。
```
>py read-test-collection.py
User data: {'id': 'db2'}
```

## 最初のプロジェクトに戻す。
```
>gcloud config set project {your-project-id}
Updated property [core/project].
```

# Links
https://qiita.com/sonots/items/906798c408132e26b41c

https://cloud.google.com/docs/authentication/application-default-credentials?hl=ja

https://cloud.google.com/sdk/gcloud/reference/auth/application-default/set-quota-project