Deviseのアカウント情報をFirebase Authenticationにお引越ししてみる

Railsでログインまわりを実現したいときによくつかうDeviseですが、認証まわりを外部サービスにお引越しするとしたらどうなるのだろうというのをお試ししてみました。 今後ソーシャルログインなどできるようにしたいと思っているのですが、これを機会に認証まわりの処理は外部サービスにお任せするのもあり?という気持ちになっているのでした。

今回は、以下のような条件で認証まわりの面倒を見てくれそうなサービスを選んでみました。

  • Twitterログインに対応していること
  • 趣味程度の利用なら無料枠で収まりそうなプランがあること
  • 既存のアカウントがお引越しできそうな環境があること

ということで、Firebase Authentication を試しに使ってみることにしました。REST APIも充実していそう なので、このへんをつかってサーバサイドでもよしなにできたり、既存の実装に合わせてスムーズに移行できそう?などをもくろんでいます。

firebase.google.com

まずは、ドキュメントに記載されたフォーマットに従い、アカウント情報をCSVファイルとしてエクスポートします。試しにダミーアプリケーションの開発環境のユーザーをエクスポートしてみます。

PostgreSQLをお使いの場合はこんなかんじのコマンドでエクスポートできました。データベースの users テーブルをSELECTして users.csv に保存します。

 psql -h localhost -p (ポート) -d (データベース名) -U (ロール) -c "select id, email, case when confirmed_at is not null then 'true' else 'false' end as validated, regexp_replace(encode(encrypted_password::bytea, 'base64'), '\n', '') from users" -A -F, -t > users.csv  

Firebase CLIをインストールして、Project IDを確認します。(以下のProject IDはダミーです)

firebase projects:list
✔ Preparing the list of your Firebase projects
┌──────────────────────┬──────────────────────┬────────────────┬──────────────────────┐
│ Project Display Name │ Project ID           │ Project Number │ Resource Location ID │
├──────────────────────┼──────────────────────┼────────────────┼──────────────────────┤
│ Hoge Project         │ hoge                 │ ??????????     │ ???                  │
└──────────────────────┴──────────────────────┴────────────────┴──────────────────────┘

DeviseはデフォルトではBCRYPTでパスワードをハッシュ化して保存しているので、デフォルトのままならユーザーデータの登録コマンドは以下のようになります。

 firebase auth:import users.csv --hash-algo=BCRYPT --project 'hoge'

これで登録ができました。ためしにログインエンドポイントをリクエストしてみます。

curl 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=(API Key)' \
-H 'Content-Type: application/json' \ 
-data-binary '{"email":"test@example.com","password":"password","returnSecureToken":true}'

なんかそれっぽいリクエストが返ってきた~。

{
  "kind": "identitytoolkit#VerifyPasswordResponse",
  "localId": "xxx",
  "email": "test@example.com",
  "displayName": "",
  "idToken": "xxx",
  "registered": true,
  "refreshToken": "xxx",
  "expiresIn": "xxx"
}

メールアドレスの検証(サインアップしたら確認メールのリンクを踏まないとアカウントが有効化されない機能)とかとか、必要な機能はそろっているようなので、ためしにいろいろいじってみて、よさそうならお引越しも検討しようと思ったのでした。

認証まわりの機能追加は、セキュリティとの兼ね合いもあってなかなか慎重になってしまうので、信頼できそうな外部サービスにお任せすると気持ち的にも楽ですし。

ではでは~。