Firebase Custom Auth と GAE/Go で �Slack認証してみた
@k2wanko
自己紹介
コキチーズ
Twitter,GitHub: k2wanko
大学4年
AndroidやWeb系のアルバイトしていた
最近はセキュリティのアルバイト中
Firebaseエンジョイ勢
認証とは何か
認証の課題
Google App Engine
Firebase Authentication
Firebase Custom Authentication System
SDKを使ってCustome Tokenを作成する
var uid = "someid";
var additionalClaims = {
premiumAccount: true
};
var token = firebase.auth()� .createCustomToken(uid, additionalClaims);
このTokenをAccessTokenとしてクライアントに渡す
SDKはNode.jsとJavaがある
Goは
ない
SDKはないけどトークンはJWTなので各言語の
JWTライブラリで作成可能
ライブラリは�github.com/dgrijalva/jwt-go を使う
golang.org/x/oauth2/jws もあるけど jwt-go はExpierの検証も�してくれるので
jwt-goでCustome Tokenを作成する
token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)
token.Header["kid"] = cert.KeyName // optional
rawToken, err := token.SigningString()
署名にはAppEngineの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)
}
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"
}
作ったCustom Tokenをクライアントに渡して
クライアントはそのアカウントでログインする
firebase.auth().signInWithCustomToken(token)
Tokenの更新
Firebaseのトークンは有効期限がMax1時間�APIを使ってRefreshできる。
firebase.auth().currentUser.getToken().then(token => {})
署名検証のための公開鍵のURL
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
検証ポイント
Demo
あとはよしなにセキュリティルールを書く
{
"rules": {
"teams": {
"$team_id": {
".write": "$team_id=== auth.token.team_id"
}
}
}
}
まとめ
ありがとうございました