即使我被匿名认证,也无法认证到Firebase Storage

时间:2018-07-13 23:25:07

标签: firebase-authentication flutter firebase-storage

我正在使用匿名身份验证。

Flutter: signed in! FirebaseUser({displayName: null, providerId: Firebase, uid: 6vj0tYIQsUSjsdiJfkjid37NhKk2, providerData: [], isEmailVerified: false, email: null, photoUrl: null, isAnonymous: true})

enter image description here

我的规则如下

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

而且我不断收到此错误

enter image description here

但是如果我将规则更改为公开

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

有效!

enter image description here

知道发生了什么吗?

这是我的代码。我找不到任何地方可以提供我的身份验证信息,也不确定是否必须这样做。

final DatabaseReference dbRef = FirebaseDatabase().reference();
final StorageReference storageRef = FirebaseStorage().ref();
final FirebaseAuth auth = FirebaseAuth.instance;

Future<void> connect() async {
  this.app = await FirebaseApp.configure(
    name: 'when-coin-test',
    options: const FirebaseOptions(
      googleAppID: '1:3739845793845:ios:9287349823487',
      apiKey: 'AoijojsoafhsdiohIOSHFOSHfoiShdfoijdf',
      databaseURL: 'https://when-coin-test.firebaseio.com',
      storageBucket: 'gs://when-coin-test.appspot.com'
    )
  );
  print("connected to firebase!");

  this.user = await this.auth.signInAnonymously();
  print("signed in! $user");

  await _getAllSocialImageUrls();
  print("got socialUrls! $socialUrls");

}

3 个答案:

答案 0 :(得分:2)

我认为您传递给configure的凭据不起作用。

Flutter的Firebase 的配置并未在各处记录。在 Android 的步骤 1。 iOS right here的步骤 2。之后,您已经设置好了凭您的凭据。
FirebaseAuth将与此配合使用,并自动与其他 Firebase插件(例如Firebase Storage)集成。

因此,您实际上可以忽略所有这些操作:

this.app = await FirebaseApp.configure(
  ...
);

如果您要处理多个项目,仍然可以使用FirebaseApp,但是对于您的用例来说,您完全不需要 访问该类。

firebase_core作为包的目的在页面上描述如下:

  

Flutter的Firebase核心

     

一个Flutter插件,可以使用Firebase Core API,该插件可以连接到 多个 Firebase应用

答案 1 :(得分:0)

我很好奇,因此我没有使用.configure()方法(如creativecreatorormaybenot所述)启动FirebaseApp。

这样做,一切正常。

app = FirebaseApp(name: 'when-coin-test');
user = await this.auth.signInAnonymously();

该示例已过期:https://github.com/flutter/plugins/blob/master/packages/firebase_core/example/lib/main.dart

答案 2 :(得分:0)

使用FirebaseAuth.fromApp(app)代替FirebaseAuth.instance。或者,您可以使用我简单的FirebaseWrapper。

import 'dart:async';
import 'dart:io';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';


Future<void> main() async {

    await FirebaseWrapper.init();

    runApp(
        MyApp(),
    );
}

class FirebaseWrapper {

    static FirebaseAuth _auth;
    static Firestore _firestore;
    static FirebaseStorage _storage;


    static Future<void> init() async {
        WidgetsFlutterBinding.ensureInitialized();

        final FirebaseApp app = await FirebaseApp.configure(
            name: 'Overload',
            options: FirebaseOptions(
                googleAppID: Platform.isIOS ? '1:0000000000:ios:000000000000' : '1:fbfbfbfbfbfbfbbf:android:fbfbfbfbfbfbfbfbf',
                gcmSenderID: '14325256252',
                apiKey: 'JHasjkhvKJKhfgKfdlLDFLkDLkDJhD',
                projectID: 'some-project-id',
            ),
        );

        _auth = FirebaseAuth.fromApp(app);

        _firestore = Firestore(app: app);

        _storage = FirebaseStorage(
            app: app, storageBucket: 'gs://overload-57752.appspot.com');
    }

    static FirebaseAuth auth() {
        return _auth;
    }

    static Firestore firestore() {
        return _firestore;
    }

    static FirebaseStorage storage() {
        return _storage;
    }
}