長らく待っていたFirebase公式のGo SDKが登場しました。
Introducing Firebase Admin SDK for Go
インストール
次のコマンドでインストールできます。
go get -u firebase.google.com/go
サービスアカウントの鍵の作成
まず認証にはGCPのサービスアカウントを利用します。
https://console.cloud.google.com/iam-admin/serviceaccounts/project?project={projectID}&authuser=0 に アクセスして鍵を作成します。
ダウンロードした鍵はservice_account.jsonとして保存しました。
セットアップ
次のコードで鍵ファイルを読み込んでFirebaseのセットアップができます。
import (
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
opt := option.WithCredentialsFile("service_account.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
カスタムトークンの作成
auth#Client.CustomToken を利用してカスタムトークンを作成できます。
カスタムトークンは自前の認証システムでUserを管理するための仕組みです。詳しくはドキュメントを参照してください。
auth, err := app.Auth()
if err != nil {
panic(err)
}
tok, err := auth.CustomToken("some-id")
if err != nil {
panic(err)
}
log.Printf("tok = %v", tok)
またauth#Client.CustomTokenWithClaimsを使えばカスタムトークンに任意の値(claims)を含めることができ、この値を使ってRealtimeDatabaseやStorageのセキュリティルールに利用できます。
tok, err = auth.CustomTokenWithClaims("some-id", map[string]interface{}{
"premium": true, // プランの実装とかに使える
})
if err != nil {
panic(err)
}
log.Printf("tok = %v", tok)
トークンの検証
auth#Client.VerifyIDToken はトークンの検証に使います。ここで検証するトークンはクライアントSDKのfirebase.User#getIdTokenで発行したトークンの検証になるので、先程作成したカスタムトークンの検証はできません。
// ftok is user.getIdToken() response
ftok := ``
t, err := auth.VerifyIDToken(ftok)
if err != nil {
panic(err)
}
log.Printf("t = %#v", t)
コード全体
package main
import (
"context"
"log"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func main() {
opt := option.WithCredentialsFile("../service_account.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
panic(err)
}
auth, err := app.Auth()
if err != nil {
panic(err)
}
tok, err := auth.CustomToken("some-id")
if err != nil {
panic(err)
}
log.Printf("tok = %v", tok)
tok, err = auth.CustomTokenWithClaims("some-id", map[string]interface{}{
"premium": true,
})
if err != nil {
panic(err)
}
log.Printf("tok = %v", tok)
// ftok is user.getIdToken() response
ftok := ``
t, err := auth.VerifyIDToken(ftok)
if err != nil {
panic(err)
}
log.Printf("t = %#v", t)
}
まとめ
現状できることはカスタムトークンを作成とFirebaseトークンの検証をできるだけですが、これからに期待してスターを付けて温かい目で見守っていきます。