【问题标题】:Swift iOS -How do I Send Firebase Token to a Https URL on Heroku?Swift iOS - 如何将 Firebase 令牌发送到 Heroku 上的 Https URL?
【发布时间】:2017-11-01 17:45:16
【问题描述】:

我正在使用 Algolia 在我的 Firebase 数据库上运行我的搜索请求。我将 Algolia 托管在带有 Node.js 文件的 Heroku 服务器上。 Algolia 通过该 Node.js app.js 文件连接到 Firebase。

为了让 Firebase 对 Algolia 进行身份验证,我需要在用户登录后生成并在客户端上进行身份验证的令牌。

Firebase 文档说要通过 Https 将令牌发送到我的后端-

Firebase: Get Tokens and Send to Https

我在 Stackoverflow 上发现了一个类似的问题,但它没有提供任何关于如何做到这一点的代码。我不是 Node.js 开发人员,只是稍微深入研究了一下,所以我需要更多上下文

How to send Firebase token to backend?

在我在func sendTokenToHerokuAppJsFile()下面创建的函数中,我可以在创建令牌后发送它。然后我可以使用 url(它是函数内的第二行)将令牌发送到,但我不知道从哪里获取 url。

如何获取将令牌发送到 Heroku app.js 文件的 URL?

更新:cmets 中的@Freya 非常有帮助地建议我在 Node 端创建一个 api,但我不是 Node 开发人员

如何在 Node.js 中创建 API 来接收令牌?

iOS 客户端 Swift 文件:

@IBAction fileprivate func signinButtonTapped(_ sender: UIButton) {

  Auth.auth().signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
            (user, error) in

            if error != nil {
                return
            }

            guard let currentUser = user else {
                return
            }

            currentUser?.getIDTokenForcingRefresh(true, completion: {
                (idToken, error) in

                if error != nil{
                    return
                }

                // Send token to your backend via HTTPS
                self.sendTokenToHerokuAppJsFile(idToken)
            })
  }
}

fileprivate func sendTokenToHerokuAppJsFile(_ idToken: String){

        let json: [String:Any] = ["token" : idToken]

        // HOW DO I GET THIS URL??
        let url = URL(string: "https://www.linkToMyHerokuAppJsFile")

        var request = URLRequest(url: url!)
        request.httpMethod = "POST"

        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
        }catch let error as NSError{
            print(error.localizedDescription)
            return
        }

        let task = URLSession.shared.dataTask(with: request) {
            (data, response, error) in

            guard let data = data, error == nil else{
                //do something
                return
            }

            do{
                let result = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]
                print(result as Any)

            }catch let error{
                print(error.localizedDescription)
            }
        }
        task.resume()
    }

Heroku App.Js 服务器文件:

var idToken;     

//Firebase-Admin Initialization
var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: "********",
    clientEmail: "********",
    privateKey: "-----BEGIN PRIVATE KEY-----\n********\n-----END PRIVATE KEY-----\n"
  }),
  databaseURL: "https://********.firebaseio.com/"
});

//Firebase Initialization
var firebase = require('firebase');
var config = {
    apiKey: "********",
    authDomain: "********.firebaseapp.com",
    databaseURL: "https://********.firebaseio.com/",
    storageBucket: "********.appspot.com",
    messagingSenderId: "********"
 };
 firebase.initializeApp(config);

admin.auth().verifyIdToken(idToken)
.then(function(decodedToken) {
  var uid = decodedToken.uid;
  firebase.auth().authenticateWithCustomToken(uid)
}).catch(function(error) {
  // Handle error
});

//Algolia Initialization
var algoliasearch = require('algoliasearch');
var algolia = algoliasearch('********', '********');

【问题讨论】:

  • 我不是 100% 清楚你的问题。我是一名新手 nodejs 开发人员(与 ios 应用程序开发人员合作),但也许我可以提供帮助。一种方法是在 node js 中创建一个 API,swift 代码将在其中发送请求。从您的节点代码来看,您似乎没有 API。您的问题是关于如何从您的 swift 代码中发出请求或如何从您的节点代码中获取令牌? (关于后面的我只能帮忙)
  • @Freya 感谢您的帮助。你准确地击中了它的头部。如果您注意到我有另一个带有类似问题的 SO 链接,答案是一种方法是在 Node.js 中创建一个 API。因为我不是 Node 开发者,所以我不知道该怎么做。文章/博客/视频的链接会有所帮助,但留下答案的人没有留下链接。你是对的,我的 Node 代码中没有 API,因为我不知道怎么做。我知道如何使用 func sendTokenToHerokuAppJsFile() 在 Swift 中发送它,但我不知道如何在 Node.js 中接收它。 我的问题是如何从我的节点代码中获取令牌。
  • 在看到您的评论后,我实际上来自其他帖子。如果您只想以最简单的方式通过 API 公开您的节点代码,我建议您使用 express。我更喜欢这两个来源之一:scotch.io/tutorials/…tutorialspoint.com/nodejs/nodejs_express_framework.htm。如果需要帮助,您可以从那里开始并发布您的代码。
  • @Freya 我更新了问题并添加了另一个问题。感谢您指出我不清楚。请再读一遍。我会查看这些链接。也许您应该将它们作为答案而不是评论发布,并将其改写为“一种简单的方法是使用 express ......如果您不知道 express(我不知道)从这些链接开始。 ...这可能不是明智的答案代码,但它会作为一个起点有所帮助。我会赞成它,因为它绝对是一个领先者。谢谢!
  • @LanceSamaria,如果我错了,请纠正我,但根据代码,您正在使用 nodejs 后端使用 firebase auth 对用户进行身份验证。一旦用户通过身份验证,您将开始搜索?您的确切用例是什么?也许您可以通过使用 nodejs / firebase 对用户进行身份验证来简化您的方法。用户通过身份验证后,您将令牌返回给应用程序。在应用程序中,您使用本地 Algolia 客户端 InstantSearch 开始搜索:github.com/algolia/instantsearch-iosgithub.com/algolia/instantsearch-ios-examples

标签: ios node.js swift heroku https


【解决方案1】:

我无法测试整个节点 js 代码,但这是一个开始:

先安装 express 并保存在 package.json 的模块列表中:

npm install express --save

var express = require('express'); //include express
var app = express(); //create your app
var idToken;     

//Firebase-Admin Initialization
var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: "********",
    clientEmail: "********",
    privateKey: "-----BEGIN PRIVATE KEY-----\n********\n-----END PRIVATE KEY-----\n"
  }),
  databaseURL: "https://********.firebaseio.com/"
});

//Firebase Initialization
var firebase = require('firebase');
var config = {
    apiKey: "********",
    authDomain: "********.firebaseapp.com",
    databaseURL: "https://********.firebaseio.com/",
    storageBucket: "********.appspot.com",
    messagingSenderId: "********"
 };
 firebase.initializeApp(config);

//here you expose the logic of token verification. From my experience, do not include the initialization (former line), or it will initialize firebase app every time you make the request
app.post('/verify_token', function (req, res) {   
    var idtoken = req.body.firebase_token; 
    admin.auth().verifyIdToken(idToken)
    .then(function(decodedToken) {
      var uid = decodedToken.uid;
      firebase.auth().authenticateWithCustomToken(uid)
    }).catch(function(error) {
      // Handle error
    });
})


//Algolia Initialization
var algoliasearch = require('algoliasearch');
var algolia = algoliasearch('********', '********');

假设节点服务器的 url 是http://mynodeserver.com。您可以以http://mynodeserver.com/verify_token 的身份访问此 API,使用 post 作为 http 方法,将 firebase_token 作为正文参数发送。我对编写工作代码的速度不够了解,当然有不同的方法可以做到这一点,但本质几乎是一样的。

基于此链接:https://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm

【讨论】:

  • 感谢您的帮助!我只是赞成它。我不接受作为答案只是因为你说你没有测试它(我知道你不知道 Swift 来测试它)。这个周末我会试试,如果它有效,我会接受它作为答案。 ???
  • 您可以将您包含在 cmets 中的链接添加到您的答案中吗?它会帮助像我这样不知道从哪里开始使用 express 的其他人
  • @LanceSamaria 没问题,我真的没有发布它来获得投票之类的东西?。无法使用 heroku 和 firebase 创建整个项目来测试此代码是否存在拼写错误或不同场景,但这绝对是一种方法。祝你的项目好运;)
  • 谢谢??? 当应用上线时我会通知您。希望下周我会把它提交给苹果。
  • 抱歉回复晚了。再次感谢???!
猜你喜欢
  • 2018-04-07
  • 2023-03-27
  • 1970-01-01
  • 2016-11-08
  • 2017-11-08
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2016-10-06
相关资源
最近更新 更多