1 of 19

Firebase Custom Auth と GAE/Go で �Slack認証してみた

@k2wanko

2 of 19

自己紹介

コキチーズ

Twitter,GitHub: k2wanko

大学4年

AndroidやWeb系のアルバイトしていた

最近はセキュリティのアルバイト中

Firebaseエンジョイ勢

3 of 19

認証とは何か

  • 正当性を検証する作業�ユーザー名とパスワードを使って�その人に権利があるかどうかを確認する

  • サービスを提供する上でほぼ必須の機能

4 of 19

認証の課題

  • セキュリティ的に気をつけなければいけないことが結構ある 初心者殺し
  • プロバイダー認証はHTTPSが必須でOSからのセットアップからだとめんどくさい

5 of 19

Google App Engine

  • GoogleのPaaSでGCPのサービスの一つ
  • 豊富な無料枠で大学生のお財布に優しい� (重要)
  • Webサービスを作るために必要な機能が�揃っている
  • Goで書くとたぶん幸せ

6 of 19

Firebase Authentication

  • パスワード認証や�プロバイダ認証を手軽に実装できる
  • 匿名認証もあるし�そこからアップグレード可能
  • Firebaseの他の機能とも密接に関わってる�基本的な機能

7 of 19

Firebase Custom Authentication System

  • Firebase Authenticationの機能の一つで�プレミアムアカウントや管理者ユーザーなど�特殊な権限付与のために使える
  • 既存の管理システムと組み合わせるために�使える
  • サーバーサイドでCustomTokenを発行して�クライアントに渡す

8 of 19

SDKを使ってCustome Tokenを作成する

var uid = "someid";

var additionalClaims = {

premiumAccount: true

};

var token = firebase.auth()� .createCustomToken(uid, additionalClaims);

このTokenをAccessTokenとしてクライアントに渡す

SDKはNode.jsとJavaがある

9 of 19

Goは

ない

10 of 19

SDKはないけどトークンはJWTなので各言語の

JWTライブラリで作成可能

ライブラリは�github.com/dgrijalva/jwt-go を使う

golang.org/x/oauth2/jws もあるけど jwt-go はExpierの検証も�してくれるので

11 of 19

jwt-goでCustome Tokenを作成する

token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)

token.Header["kid"] = cert.KeyName // optional

rawToken, err := token.SigningString()

12 of 19

署名にはAppEngineのApp Identity APIを使う

  • App Identity APIは公開鍵暗号の�キーペアを管理してくれる機能

keyName, sig, err := appengine.SignBytes(c, []byte(rawToken))

if err != nil {

log.Fatal(err)

}

if keyName == cert.KeyName {

rawToken = strings.Join([]string{rawToken, jwt.EncodeSegment(sig)}, ".")

fmt.Logf("token: %v", rawToken)

}

13 of 19

Custom Token の内容

{

"uid": "someid",

"claims": {

"premium_account": true

},

"aud":"https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",

"exp": 1474579032,

"iat": 1474575432,

"iss": "testapp@appspot.gserviceaccount.com",

"sub": "testapp@appspot.gserviceaccount.com"

}

14 of 19

作ったCustom Tokenをクライアントに渡して

クライアントはそのアカウントでログインする

firebase.auth().signInWithCustomToken(token)

15 of 19

Tokenの更新

Firebaseのトークンは有効期限がMax1時間�APIを使ってRefreshできる。

firebase.auth().currentUser.getToken().then(token => {})

署名検証のための公開鍵のURL

https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

検証ポイント

  • 有効期限: Firebaseのトークンの有効はMax1時間
  • Audienceはちゃんと自分のプロジェクトIDか

16 of 19

Demo

17 of 19

あとはよしなにセキュリティルールを書く

{

"rules": {

"teams": {

"$team_id": {

".write": "$team_id=== auth.token.team_id"

}

}

}

}

18 of 19

まとめ

  • GoogleやFacebook認証が凄まじく楽
  • サードパーティの認証も�CustomTokenを使えば楽
  • 認証がすごく楽になりました
  • わからないことは�GCPUGの人に聞きましょう!

  • 詳しくはWebかGCPUGで!

19 of 19

ありがとうございました