将connectParams与JWT

时间:2017-08-29 09:14:19

标签: ios swift socket.io jwt

我使用https://github.com/auth0/socketio-jwt将用户连接到我的node.js / socket.io服务器,并且我使用了一次往返

我现在的问题是,无论何时用户登录IOS部分,socket.connect()都不一致,我的理论是即使在socket.connect()被调用之前令牌还没有准备好。

我在Socket.io课程中使用Singleton设计,因为很多人指出了这一点。

这是SocketManager.swift部分

上的代码
import SocketIO

class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()
    var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": getToken()])]) // getToken() I got it from other file which is Constant.Swift

    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }       
}

我使用KeychainAccess存储令牌,Constant.Swift文件存储所有全局变量和函数,以便我可以在任何Swift文件上调用它。

Constant.Swift

import Foundation
import KeychainAccess

let keychain = Keychain(server: "www.example.com", protocolType: .https)

func getToken() -> String {
    if let token = keychain["token"] {
        return token
    }
    return ""
}

LoginViewController.swift

@IBAction func facebookButtonClicked(_ sender: UIButton) {
       Alamofire.request("/login", method: .post, parameters: parameters, encoding: JSONEncoding.default)
            .responseJSON { response in
                if let value = response.result.value {
                    let json = JSON(value)

                    self.keychain["token"] = String(describing: json["token"])
                    SocketIOManager.sharedInstance.establishConnection() 
                    self.segueToAnotherVC() // Segue to another screen, to simplify things i put it in a function
                }
        }
}

从技术上讲,这个控制器发生的事情是,当用户登录时,我会将令牌存储到KeychainAccess中(它相当于NSUserDefaults),然后我才会建立套接字连接,因为套接字连接需要预先设置一个令牌。

每当用户登录时,我该怎么做才能使连接始终保持一致?我可以用的任何方法吗?

1 个答案:

答案 0 :(得分:1)

我建议您使用这样的钥匙串:

let keychain = KeychainSwift()
keychain.set("string", forKey: "key")
keychain.get("key")
keychain.delete("key")

keychain用法:

let saveBool: Bool = KeychainWrapper.setString("String", forKey: "key")  
let retrievedString: String? = KeychainWrapper.stringForKey("key")
let removeBool: Bool = KeychainWrapper.removeObjectForKey("key")

确保在调用建立连接时设置了令牌,如果没有,请不要尝试连接。

参考文献:

https://github.com/socketio/socket.io-client-swift/issues/788

https://github.com/marketplacer/keychain-swift

https://github.com/jrendel/SwiftKeychainWrapper

更多信息:

JSON Web Token是一个基于JSON的开放标准,用于创建声明一些声明的访问令牌。