Help us understand the problem. What is going on with this article?

Firebase storageでのグループ認証

More than 1 year has passed since last update.

最近Firebaseを使うことが多くなったのですが,グループ認証に悩んだのでメモしときます.

グループ認証の方法

Firebase databaseのデータを直接Storageが参照できればいいのですが,それはできません.
なので,仲介役としてAuthのCustomClaimを使います.

CustomClaimは本来,有料会員のフラグを保存したりするものらしいので,チョット使い方が違うような気もしますが,Storageから参照できるものが他にないのでこれを使います.

(一応,公式ドキュメントにもこの手法で書いてありました)

作り方

前提

Firestore databaseにユーザー情報があったとします.

{ 
  users:{
    userA :  {
      groups : {
        groupA : true
        groupB : true
      }  
    },
    userB :  {
      groups : {
        groupB : true
        groupC : true
      }  
    }
  }
}

この情報をuserAはuserAのCustomClaimに,userBはuserBのCustomClaimにいれます.
CustomClaimはadmin権限がないといじれないので, Cloud Functionsで実行します.

cloud functionの設定

index.js
exports.updateUserGroupGrant = functions.database.ref('/users/{userId}/groups')
    .onWrite(event => {
      return refreshCustomClaims(event.params.userId);
    });

function refreshCustomClaims(userId){
  return admin.database().ref('/users/' + userId + "/groups").once('value').then((snapshot) => {
    var claim = {};
    for (var key in snapshot.val()){
      claim[key] = true;
    }
    return admin.auth().setCustomUserClaims(userId, claim);
  });
}

databaseを監視し,/users/{userId}/groupsが何か変化あったら`refreshCustomClaimsを呼びます

refreshCustomClaimsでは引数で渡されたuserIdのclaimを作成し,admin.auth().setCustomUserClaimsで保存しています

strageの設定

Strageのルールではrequest.auth.tokenでclaimが取れるので,そこの値を使って認証します.
request.auth.token[groupId]と言う書き方で変数を組み込むことができます
※ドキュメントの記載を見つけられていないので,動作保証はされないかもしれません

strage.rules
service firebase.storage {
  match /b/{bucket}/o {
    match /groups/{groupId} {
       match /{path=**} {
          allow read, write: if request.auth!=null
                            && request.auth.token[groupId] == true;
       }
    }
  }
}

これでdatabaseを使ってstrageでの認証ができました.

注意点

claimは認証以外に使わないでください(データは入れないでください)と公式ドキュメントに書いてあります.
今回のは認証に使っているので違反しているわけではないのですが,データに対応していない=たくさん情報を詰め込むことを想定していない ということだと思うので,
大量のグループがある場合,この方法はちょっと見直さないといけないかもしれません.

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away