【发布时间】:2016-05-31 15:22:46
【问题描述】:
我的目标很简单,通过 socket.io jwt 对用户进行身份验证。这样我就可以实时操作他/她的数据。
客户端代码
import SocketIOClientSwift
import KeychainAccess
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
// 1
let keychain = Keychain(server: "https://testing.herokuapp.com", protocolType: .HTTPS)
//2
var token: String {
get {
if let realToken = keychain["token"] {
return String(realToken)
} else {
return ""
}
}
}
//3
lazy var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: "https://testing.herokuapp.com")!,
options: [.Log(true), .ConnectParams(["token": self.token])])
override init() {
super.init()
}
func establishConnection() {
socket.connect()
}
func closeConnection() {
socket.disconnect()
}
}
仅供大家理解
- 钥匙串的目的只是为了存储令牌,假设我已经保存了
来自登录用户的令牌,那么我将简单地执行此操作
keychain["token"] = "token",让我们假设令牌已经 已保存 -
var token是获取token,因为目前keychain store 令牌是可选的,因此我需要进行可选绑定。 - 最后我实例化了一个套接字对象,这样我就可以传递令牌
作为参数,很多人建议这样做
.ConnectParams(["token": self.token])
到目前为止一切顺利,但现在,每当我尝试在应用委托中建立连接时,
AppDelegate.Swift
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
SocketIOManager.sharedInstance.establishConnection()
}
我会收到的
Handling event: error with data: (
{
code = "invalid_token";
message = "secret or public key must be provided";
type = UnauthorizedError;
} )
为了清楚起见,我不想包含服务器端代码,因为它只是来自 https://github.com/auth0/socketio-jwt 的样板代码
那么,真正的问题是,我做错了什么?
【问题讨论】: