我正在开发一款用 SWIFT
编写的IOS社交应用。
后端使用的是PHP、MySQL
(用于事件处理)和一些NodeJS、Socket.io
(用于实时聊天和通知)。
我已经成功地创建了聊天功能:
当用户发送消息时,Socket.io服务器会按照以下方式进行处理:
- 将数据插入到数据库中
- 如果成功,则向所有参与者用户发出消息
/ 因此,后端仅为Socket.io服务器,它也处理数据库
效果很好。
但是,还有一些不需要实时处理的事件,但我仍然想通过Socket.io向指定用户发送通知。
例如:如果一个帖子被点赞,则向帖子所有者发送通知
我已经编写了用于将喜欢保存到数据库的PHP文件,但是
我该如何安全地处理通知部分?
我想到了3个方法:
- 应用程序向我的PHP + MySQL后端发送Web请求,然后在返回“成功”后,应用程序(SWIFT)通过Socket.io XCode pod向帖子所有者发送通知
func likePost(postId : Int, completion: @escaping (ActionResult?)->()){
let connectUrl = URL(string: appSettings.url + "/src/main/like.php")
var request = URLRequest(url: connectUrl!)
request.httpMethod = "POST"
let postString = "userId=\(userId)&session=\(session)&pId=\(postId)"
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) {
(data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
do {
let responseJson = try JSONSerialization.jsonObject(with: data!, options: [])
if let responseArray = responseJson as? [String: Any] {
let responseStatus = responseArray["status"] as? String
let responseTitle = responseArray["title"] as? String
let responseMessage = responseArray["message"] as? String
if responseStatus != "1" {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
// SUCCESS, SEND NOTI WITH SOCKET.IO
socket.emit("notification_likedPost", ["postId": postId)
return completion(ActionResult(type: 1, title: "success", message: "yay"))
}
} catch {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
}
task.resume()
}
- 同样的,但在从PHP返回“成功”后,PHP文件本身处理Socket.IO通知的发出(我认为这是不可能的,我没有找到任何PHP-> Socket.io插件..)
-
- 该应用程序不会向我的Web PHP + MySQL文件发送任何内容,而是将整个“喜欢”过程发送到我的NodeJs,Socket.IO服务器中处理,将其保存到数据库中,然后发出通知(就像实时聊天部分一样,但这将需要很多工作,因为我已经编写了所有其他代码在PHP文件中)
第一种情况对我来说最理想,但我担心它容易被黑客攻击。
因为如果我使用第一种方式,后端的NodeJs + Socket.io服务器将不会检查“喜欢”过程是否成功(因为已在客户端检查)。
因此,任何人都可以发送虚假的“发布喜欢”通知,就像一亿次那样。
那么也许第二种选项也很棒,因为后端处理检查和通知发送,但可悲的是,PHP没有Socket.io插件