Go
Firebase

遂にFirebase Admin SDK Goが登場!

More than 1 year has passed since last update.

長らく待っていた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 に アクセスして鍵を作成します。

スクリーンショット 2017-08-31 11.41.41.png

ダウンロードした鍵は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)


コード全体

https://github.com/k2wanko/tasting-firebase-go/blob/ae9a032/basic/basic.go


basic.go

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トークンの検証をできるだけですが、これからに期待してスターを付けて温かい目で見守っていきます。 :eyes:

https://github.com/firebase/firebase-admin-go