【问题标题】:Firebase iOS SDK authentication with private Google storage使用私有 Google 存储的 Firebase iOS SDK 身份验证
【发布时间】:2018-07-27 17:54:19
【问题描述】:

我正在我的应用(macOS 应用)中使用适用于 iOS/macOS 的 Firebase SDK 进行测试。我已经使用以下方式安装了 SDK:

pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '4.8.2'
pod 'FirebaseAuth', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '4.8.2'
pod 'FirebaseStorage', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :tag => '4.8.2' 

安装运行良好,我可以使用 [FIRApp configure]; 在 AppDelegate 中配置我的应用程序

我想知道我是否可以使用 SDK 将用户登录到他/她的私有 Google Cloud Storage (GCS)?我知道我可以使用 SDK 在应用程序存储中存储到 GCS,但最好登录到用户自己的 GCS 以检索存储桶和文件的列表。如果有人有一个关于如何做到这一点的例子,我将不胜感激。我找到的所有示例都是针对匿名存储登录的。

更新: 我可以指定我希望 Firebase SDK 包含一种身份验证方法,允许我访问我自己的 Google 云存储帐户。也许 Firebase 不是这个的正确选择,但我会对 Swift/objective-c 登录/上传/下载到 Google 云存储的替代 SDK 的建议非常感兴趣。

【问题讨论】:

    标签: swift firebase firebase-authentication google-cloud-storage firebase-storage


    【解决方案1】:

    您确实可以使用适用于 iOS 的 Firebase SDK 来使用 Firebase Cloud Storage (which in fact stores data in Google Cloud Platform Cloud Storage's buckets),同时使用 Swift 和 Objective-C。

    iOS 中的 Firebase 云存储

    关于在 Firebase 应用中使用 Cloud Storage 存储分区,您可以从 this documentation page 开始。首先,您必须为存储桶设置适当的安全规则:您可以允许公共访问、仅对经过身份验证的用户进行访问,甚至是按用户 ID 访问。您可以使用一些 sample rules 来开始使用它。

    一旦您为存储存储分区设置了适当的访问权限(如果每个用户都有自己的存储分区,那么我假设每个用户都有一个带有私有存储分区的 GCP 帐户,并且他们必须自己设置配置访问权限,如您将无法访问它们),您可以将 Cloud Storage 依赖项添加到您的 iOS 应用中:

    pod 'Firebase/Core'
    pod 'Firebase/Storage'
    

    然后运行pod install,在您的应用中初始化 Firebase 后,您已经可以create the reference to Cloud Storage(这里有一个 Swift 示例代码,但您也可以查看文档中的 Objective-C 示例):

    // Import and set up Firebase
    import Firebase
    FirebaseApp.configure()
    
    // Create a storage reference
    let storage = Storage.storage()
    let storageRef = storage.reference()
    
    // Refer to a child directory or even a file
    let folderRef = storageRef.child("my_folder")
    var fileRef = folderRef.child("my_file.txt")
    

    一旦掌握了所有这些,您就可以继续使用更复杂的指南,例如uploading files、downloading files 或(重要的)handling errors。请记住,这些只是您可以按照分步文档进行操作的一些示例,但您可以随意浏览所有页面,以便更深入地了解所有这些操作的工作原理。

    iOS 中云存储的 Firebase 身份验证

    此外,关于身份验证,您可以遵循您可能已经在 Firebase 应用程序的其余部分使用的相同规则。让我分享另一个页面,讨论一些提供Firebase Authentication 的机制,特别是如何提供Firebase Authetication on iOS。

    【讨论】:

    • @dseto:谢谢!我仍然不清楚我想要的是否可能。您说“...如果每个用户都有自己的存储桶,那么我假设每个用户都有一个带有私有存储桶的 GCP 帐户,他们必须自己设置配置访问权限,因为您将无权访问他们”。这正是我想要的,但我不知道该怎么做。我将如何使用 Firebase (FB) SDK 登录用户来访问他们自己的 GCS?我只能看到通过 FB 登录可以访问我的应用程序存储空间,而不是他们的私人空间。对我可以使用的其他 SDK 有什么建议吗?
    • 我认为您无法使用 GCP 凭据对每个用户进行身份验证,以便他们使用自己的存储桶(尽管我不是 Firebase 专家)。我看到的唯一可能性是使用该功能指向一个自定义存储桶(这将是每个用户的存储桶),这将是非常不可行的,如documented。但这样一来,每个用户都必须自己创建存储桶,授予权限,然后在 Firebase 应用程序中,以某种方式设置存储桶名称,以便在我共享的链接中设置。
    【解决方案2】:

    我不确定我是否完全理解您的要求。但如果我这样做......这可能会有所帮助。我使用 Google Storage 保存照片。要访问这些照片,我需要存储 URL 以找到这些照片。我在 Firebase 实时数据库中做到了这一点。如果您将不同类型的文件存储到 GCS,您只需要该 URL 即可检索数据。

    if let photoData = UIImageJPEGRepresentation(jpegRepresentation!, 1.0) {
                        storePhoto(photoData, angel.name!, completion: { (url, err) in
                            if err != nil {
                                print(err?.localizedDescription)
                                angelToSave["photo"] = nil
                                myAngelsRef.updateChildValues(angelToSave, withCompletionBlock: { (error, ref) in
                                    if error != nil {
                                        completion(error!)
                                    } else {
                                        completion(nil)
                                    }
                                })
                            } else {
                                      // ### HERE ####
                                angelToSave["photo"] = url?.absoluteString
                                angelNameRef.updateChildValues(angelToSave)
                                completion(nil)
                            }
                        })
                    }
    
    func storePhoto(_ photo: Data, _ name: String, completion: @escaping (_ result: URL?, _ error: NSError?) -> Void) {
            let storageRef = Storage.storage().reference().child(name)
            storageRef.putData(photo, metadata: nil) { (storageMetaData, err) in
                if err != nil {
                    completion(nil, NSError(domain: (err?.localizedDescription)!, code: 0, userInfo: nil))
                } else {
                    completion(storageMetaData?.downloadURL(), nil)
                }
            }
        }
    

    保存照片后,我能够获取 URL 位置并将其保存到我存储在 RTDB 中的对象中。现在,当我从用户的 RTDB 中提取数据时,我得到了存储数据的 URL。

    【讨论】:

    • 感谢 Jake 提供的有用方法。这仍然保存到应用程序 Firebase 数据库中,对吧?它不保存到用户私有的谷歌云存储空间吗?我希望 Firebase 包含一种用于登录我自己的 Google 帐户的身份验证方法,并为我提供对我的 Google 云存储的直接访问权限。也许我应该为此使用 Firebase 以外的其他东西。
    • 有一个用于 GCS 的 api,您可以查看。我没有这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2021-11-01
    • 2016-09-26
    • 2017-06-07
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多