【发布时间】: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