【问题标题】:Cannot auth to Firebase Storage even though I'm authenticated anonymously即使我通过匿名身份验证,也无法对 Firebase 存储进行身份验证
【发布时间】:2018-12-22 08:32:02
【问题描述】:

我有匿名身份验证工作。

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

我的规则如下

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

我一直收到这个错误

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

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

有效!

知道发生了什么吗?

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

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");

}

【问题讨论】:

  • 我脑子里闪过这么多想法:我很确定 configure 是完全可选的,而且我知道您不需要多次登录。我猜您的登录在您提出请求时尚未处理。
  • 不过,我确实在等待登录。他们正在成功地按顺序记录。
  • @creativecreatorormaybe不是你说配置是可选的吗?有没有显示如何在不配置的情况下进行设置的 sn-p?

标签: firebase-authentication flutter firebase-storage


【解决方案1】:

使用 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;
    }
}

【讨论】:

    【解决方案2】:

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

    Firebase for Flutter 的配置并未随处记录。按照 Android 的步骤 1.iOS 的步骤 2. right here,您已经设置好了您的凭据。
    FirebaseAuth 将使用它并自动与其他 Firebase 插件集成,例如 Firebase Storage。

    因此,您实际上可以省略所有这些:

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

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

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

    用于 Flutter 的 Firebase 核心

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

    【讨论】:

    • 这是否意味着我根本不需要 firebase_core? (每个应用一个项目)
    • @LukePighetti 完全正确,每个包都会自行处理并自动添加所需的本机代码。我在回答中添加了一些更多信息。也许您可以调整您的问题,将在更广泛范围内有类似问题的人引导到此页面。
    • 您对如何改进我的问题有什么建议吗?
    • @LukePighetti 这个问题本身很好。只是不是很笼统。这个问题不仅适用于 Firebase 存储,也适用于 Flutter 的所有 Firebase 插件。只是我想到的。
    【解决方案3】:

    我很好奇,所以我在没有 .configure() 方法的情况下启动了 FirebaseApp(正如 creativecreatorormaybenot 提到的那样)。

    这样做,一切正常。

    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

    【讨论】:

    • 我能够提出我的答案以及一些额外的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2017-09-18
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多