Firebase認証でWeb / JS SDKを使用して(電話番号を使用して)ユーザーを認証し、セキュリティルールを設定してFirestoreドキュメントを(Web SDKも使用して)作成しようとしています。ただし、認証されているにもかかわらず、何らかの理由でリクエスト認証が null であるため、すべてのセキュリティ ルールが失敗します。以下の例では、ID が認証されたユーザーの uid (Firebase によって生成されたもの) と等しいドキュメントを作成しようとしています。この場合の uid はpbc5l8cca7ELtwM0Kxctn9xLeT2i
(デバッグ ログに表示されます)。
私のルール:
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /preferences/{userId} {
allow read, update: if debug(request.auth) != null && debug(request.auth.uid) == userId;
allow create: if debug(request) && debug(request.auth) != null;
}
行のデバッグallow create
はリクエストを出力していますが、ヘッダーに Bearer トークンがあるのは奇妙なことです (認証されていないときに同じことをしようとすると、これが失われます) が、リクエストの auth 属性は null です。
Apr 16, 2021 6:20:42 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
Apr 16, 2021 6:20:42 PM com.google.net.webchannel.server.common.CorsFilter populateCustomHeaders
WARNING: Invalid $httpHeaders: X-Goog-Api-Client:gl-js/ fire/8.4.1
X-Firebase-GMPID:1:855732088727:web:38fc76872a93ee3e979ed2
Content-Type:text/plain
Authorization:Bearer eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJwaG9uZV9udW1iZXIiOiIrMTEyMjMzMzU1NTUiLCJhdXRoX3RpbWUiOjE2MTg2MTE2MjYsInVzZXJfaWQiOiJwYmM1bDhjY2E3RUx0d00wS3hjdG45eExlVDJpIiwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJwaG9uZSI6WyIrMTEyMjMzMzU1NTUiXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwaG9uZSJ9LCJpYXQiOjE2MTg2MTE2MjYsImV4cCI6MTYxODYxNTIyNiwiYXVkIjoiZWFybmhhdXMtc3RhZ2luZyIsImlzcyI6Im0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS9lYXJuaGF1cy1zdGFnaW5nIiwic3ViIjoicGJjNWw4Y2NhN0VMdHdNMEt4Y3RuOXhMZVQyaSJ9.
Apr 16, 2021 6:20:42 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
Apr 16, 2021 6:20:42 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
INFO: Detected non-HTTP/2 connection.
map_value {
fields {
key: "auth"
value {
null_value: NULL_VALUE
}
}
fields {
key: "headers"
value {
map_value {
}
}
}
fields {
key: "inTransaction"
value {
bool_value: true
}
}
fields {
key: "method"
value {
string_value: "create"
}
}
fields {
key: "path"
value {
path_value {
segments {
simple: "databases"
}
segments {
simple: "(default)"
}
segments {
simple: "documents"
}
segments {
simple: "preferences"
}
segments {
simple: "pbc5l8cca7ELtwM0Kxctn9xLeT2i"
}
}
}
}
fields {
key: "readFields"
value {
null_value: NULL_VALUE
}
}
fields {
key: "resource"
value {
map_value {
fields {
key: "__name__"
value {
path_value {
segments {
simple: "databases"
}
segments {
simple: "(default)"
}
segments {
simple: "documents"
}
segments {
simple: "preferences"
}
segments {
simple: "pbc5l8cca7ELtwM0Kxctn9xLeT2i"
}
}
}
}
fields {
key: "data"
value {
map_value {
fields {
key: "paymentMethod"
value {
string_value: "venmo"
}
}
fields {
key: "paymentRecipient"
value {
string_value: "+11223335555"
}
}
}
}
}
fields {
key: "id"
value {
string_value: "pbc5l8cca7ELtwM0Kxctn9xLeT2i"
}
}
}
}
}
fields {
key: "time"
value {
timestamp_value {
seconds: 1618611642
nanos: 877000000
}
}
}
fields {
key: "transforms"
value {
null_value: NULL_VALUE
}
}
fields {
key: "writeFields"
value {
null_value: NULL_VALUE
}
}
}
null_value: NULL_VALUE
Apr 16, 2021 6:20:42 PM com.google.cloud.datastore.emulator.impl.util.WrappedStreamObserver onError
INFO: operation failed:
false for 'create' @ L7
null であるという事実は、セキュリティ ルールを適用することを不可能にします。私は何を間違っていますか?