FlaskフレームワークでFirebase Authentication の認証機能をすぐに使えるFlask-FirebaseAuthとflask-login

# 準備
Windows10で、git、python、gcloudをインストールし、開発環境を準備しておきます。

## Firebaseプロジェクトの作成
次の記事を参考にして、Firebaseプロジェクトを作成します。
[Firebaseの準備 - App Engine 上でFirebase Authenticationを用いたFirebase 認証チュートリアル(Windows10)](https://qiita.com/jp-96/items/8ed86290c412faa3aa7e#firebase%E3%81%AE%E6%BA%96%E5%82%99)

## Exampleのクローン

```
cd c:\workgit
git clone https://github.com/jp-96/Flask-FirebaseAuth-Example.git
cd Flask-FirebaseAuth-Example
```

## virtualenvの設定

```
py -3 -m virtualenv --python "C:\Python37\python.exe" venv
venv\Scripts\activate.bat
```

## パッケージのインストール

```
pip install git+https://github.com/jp-96/Flask-FirebaseAuth.git
pip install flask-login
```

## ローカル環境での実行（[http://localhost:5000/](http://localhost:5000/)）

```
python app.py
```

http://localhost:5000/ へアクセスし、次のいずれかのメールアドレスで、「Development sign-in」からサインイン（ログイン）できます。

- user01@your.domain
- user02@your.domain
- user03@your.domain
- user04@your.domain

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/9b502997-05aa-11cb-77b4-6b779bff1359.png)

# アプリケーション設定(app.py)

## SECRET_KEYの生成と設定

pythonを起動し、uuidを生成します。

```
>>> import uuid
>>> uuid.uuid4().hex
'50a4cc1612bd4fd39ff7a1bec839d380'
>>> quit()
```

SECRET_KEYに生成したuuidを設定します。

```
app.config['SECRET_KEY'] = "50a4cc1612bd4fd39ff7a1bec839d380"
```

## Firebaseキー項目の設定

1. Firebaseページの「Project Overview」の右の歯車アイコンをクリックし、「プロジェクトの設定」を開きます。
1. FIREBASE_API_KEYにウェブ API キーの値を、FIREBASE_PROJECT_IDにプロジェクト IDの値を、それぞれ設定します。
1. FIREBASE_AUTH_SIGN_IN_OPTIONSには、使用するFirebase認証のプロバイダーをカンマ区切りで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/48409a38-d1f1-038d-82d3-bfb44b71e1b0.png)

```
app.config['FIREBASE_API_KEY'] = 'AIzaSyDblXUzVU9K70-a4Lw3NrW3L3DTfqBBsyE'
app.config['FIREBASE_PROJECT_ID'] = 'my-firebaseauth-4f12e'
app.config['FIREBASE_AUTH_SIGN_IN_OPTIONS'] = 'email,google'
```

## ユーザーデーターベース（ダミー）の設定

Exampleでは、データーベースを使用せずに、ハードコーディングで代用しています。
テストで使用するFirebase認証プロバインダーの電子メールアドレスに書き換えます。

```
class User(UserMixin):
    # user database
    users = {
        'example01@gmail.com': {'name': 'Gmail example user1'},
        'myname@my.domain': {'name': 'My e-mail'},
        'user03@your.domain': {'name': 'debug03'},
        'user04@your.domain': {'name': 'debug04'},
    }
```

# GAEへのデプロイ
gcloudを使って、デプロイします。

```
gcloud init
gcloud app deploy
```

※ 初回のデプロイ時にエラーが発生します。指定のurlへアクセスして、有効化してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/5e91ceb8-5aab-745d-d1a0-3552d996f41b.png)

デプロイ完了後に、次のコマンドで、https://[project-id].appspot.com/へアクセスできます。

```
gcloud app browse
```

# クリーンアップ
このExampleで使用したリソースについて GCP アカウントに課金されないようにするために、App Engine プロジェクトを次の手順で削除してください。

1. GCP Console で プロジェクト ページに移動します。[→プロジェクト ページに移動](https://console.cloud.google.com/cloud-resource-manager)
1. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
1. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除(シャットダウン)します。

# まとめ

- [Flask-FirebaseAuth-Example](https://github.com/jp-96/Flask-FirebaseAuth-Example.git)をgitクローンしました。
- [Flask-FirebaseAuthパッケージ](https://github.com/jp-96/Flask-FirebaseAuth.git)をpipインストールしました。
- ローカル環境でデバッグ実行しました。
- アプリケーションを設定しました。
- GAEにデプロイし、実行しました。
- 課金されないようにクリーンアップしました。