LoginSignup
13

More than 5 years have passed since last update.

GAE/GoでFirebase Service Account 機能を扱うためのライブラリを公開しました

Posted at

GAE/Fire について

@eaglesakura です。

githubにて、以前記事に書いた認証周り+αを行うライブラリ GAE/Fire を公開しました。

機能一覧や使い方はREADMEに書いてある通りで、主にFirebase Custom Authenticationやモバイルアプリと統合して利用することを前提としています。

GAE/Fireを利用することで、下記のような利点があります

  • クライアント(Android等)のAuth Token管理をFirebase SDKに行わせることができる
  • サーバー(GAE/Go)が独自にAuth関連機能を持つ必要がない
  • FirebaseのユーザーIDを任意の文字列にできる(Firebase Custom Tokenを使用した場合)
  • Firebase DatabaseやStorageに任意のRuleデータを追加できる(Firebase Custom Tokenを使用した場合)

実装済機能一覧

  • Json Web Token(JWT) 管理
  • OAuth2 Token管理
    • Service Account権限を持ったOAuth2 Token Generate / Refresh / Verify
    • Google Play Service(Android)にて発行された access_code からOAuth2 TokenのGenerate / Refresh / Verify
    • MemcacheによるToken Cache
  • Cloud Endpoints 2.0相当の認証サポート
    • Service Control API を経由した Google Cloud Console API Key のVerify
    • Authorization HeaderのVerify / Google Cloud Endpoints 2.0互換 X-Endpoint-API-UserInfo Header Generate
    • swagger.json に基づいたOAuth2 audience verify
    • swagger.json に基づいたGoogle Id Token audience verify
    • TODO: swagger.json に基づいたPath単位での認証ON/OFF

Cloud Endpoints 2.0認証について

Cloud Endpoints 2.0という機能が最近GAE/JやFlex Environmentに入りました。これは高性能なログ機能なほかに、認証周りのサポートも行ってくれます。
前回の記事の通り、JWTやOAuth2による認証の際にはaudiss等幾つかの必須チェックがありますが、Cloud Endpoints 2.0ではnginxベースのProxy、もしくはGoogleが提供するフレームワーク部分が全てそれらを代行してくれるようです。
また、GCPのコンソールによって発行されたAPI Keyのverify機能も提供されています。

この記事を書いている時点で、Cloud Endpoints 2.0はGAE/Go Std Environmentに対して提供されていません。ですが認証周りはREST APIによって再現可能でしたので、GAE/Fireでは認証情報のVerifyを提供しています。

GAE/Fireがサポートしている認証形式は下記です。
aud及びiss相当のデータをチェックを行うため、第三者が勝手に生成したTokenはerrorとして扱います。

  • Authorization: Bearer {google-id-token(Google sign-in)}
  • Authorization: Bearer {firebase-auth-json-web-token(Firebase SDK)}
  • Authorization: Bearer {json-web-token(GAE/Fire)}
  • Authorization: Bearer {google-oauth2-token}
  • API Key(query|header)

ユースケース

下記のような認証トークンの流れを想定しています。
Firebase-Auth等に使われるjson-web-tokenはヘッダ自体にユーザー情報を含んでいるので、Datastore等のアクセスを行う必要がなく、安価にユーザーチェックをこなすことができます。

  • 初回ログイン時
    1. Google Sign-In SDKによってGoogle Id Tokenを取得する
    2. サーバー側でユーザーのリソースにアクセスする場合は、上記に加えてサーバー用のAccessCodeも要求する
    3. 取得したGoogleIdTokenとAccessCodeをサーバーに送信する
      • curl -H "Authorization: Bearer {google-id-token}" https://example.com/token?accessCode={AccessCode}
    4. GAE/FireでAuthorizationヘッダを検証し、問題なければ生成したFirebase Custom Auth用のトークンを返却する
      • 必要であればユーザーのOAuth2トークンも取得して、RefreshTokenをDatastoreに保存する
    5. トークンを用いてFirebaseにログインする
  • 認証以後の通信
    1. FirebaseからgetToken()相当のメソッドで通信トークンを得る
    2. 通信トークンを用いてAPIを叩く
      • curl -H "Authorization: Bearer {firebase-token}" https://example.com/users/me
    3. GAE/FireでAuthorizationヘッダを検証し、問題なければ処理を継続する

最後に

何か不具合や問題があったらissueを書いてくれるとありがたいです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13