やりたいこと
- Unityからローカルのファイルをアップロードしたい
- Storageのセキュリティルールでメタデータが一致することをチェックして許可/拒否判定したい
起こっていること
アップロードに失敗し、task.Exceptionが下記のようになっている
System.AggregateException: One or more errors occurred. ---> Firebase.Storage.StorageException: Permission denied. Could not perform this operation Http Code: 403 --- End of inner exception stack trace --- ---> (Inner Exception #0) Firebase.Storage.StorageException: Permission denied. Could not perform this operation Http Code: 403<---
上記より、セキュリティルールの権限がないと判断しました。
試したこと
- セキュリティルールを全開放(allow read, write: if true;)するとアップロード出来ていることを確認
- アップロードできたファイルを確認するとメタデータに(folder:uploadFolder)が付加出来ていることを確認
- セキュリティルールのシミュレータでは成功することを確認
- Web(Node.js)から同様にメタデータを付加してアップロードすると成功することを確認
#Firebase Storage セキュリティルール
service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read: if true; allow write: if request.resource.metadata.testMeta == "AAA"; } } }
Unity側のソース(の一部)
storage = FirebaseStorage.DefaultInstance; StorageReference storage_ref = storage.GetReferenceFromUrl("gs://testfirebaseXXX.appspot.com"); string local_file = "/Users/XXX/test.txt"; // この時点ではまだストレージ側にファイルはない StorageReference test_ref = storage_ref.Child("test_storage.txt"); var metadataChange = new Firebase.Storage.MetadataChange(); var customMetadata = new Dictionary<string, string>(); customMetadata["folder"] = "uploadFolder"; metadataChange.CustomMetadata = customMetadata; metadataChange.ContentType = "text/plain"; test_ref.PutFileAsync(local_file, metadataChange) .ContinueWith (task => { if (task.IsFaulted || task.IsCanceled) { Debug.Log("アップロード失敗"); //Debug.Log("folder:::" + task.Result.GetCustomMetadata("folder")); Debug.Log(task.Exception.ToString()); } else { Debug.Log("アップロード成功!!!"); var download_url = test_ref.GetDownloadUrlAsync(); Debug.Log("Finished uploading"); Debug.Log("download url = " + download_url); } });
Webからは成功することから、
Unity側ソースの書き方が間違っているのだと思いますが、
セキュリティルールを開放した際はアップロード出来、メタデータが入っているので、
メタデータが渡っていないわけでもなさそう、ということで全然分からず、ぜひご教授頂けますと幸いです。
宜しくお願い致します。