Подтвердить что ты не робот

Socket.connect() несовместим при использовании connectParams с JWT

Я использую https://github.com/auth0/socketio-jwt, чтобы подключить пользователя к моему серверу node.js/socket.io, и я используя одну поездку в оба конца

Моя проблема прямо сейчас заключается в том, что всякий раз, когда пользователь входит в IOS-часть, socket.connect() несовместим, моя теория заключается в том, что токен еще не готов еще до вызова socket.connect().

Я использую дизайн Singleton для своего класса Socket.io, как многие люди указали на это.

Здесь код в части 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), тогда только я сделаю сокет-соединение, потому что соединение сокета требует токена заранее,

Что мне делать, чтобы соединение было согласованным все время, когда пользователь входит в систему? Любые методы, которые я мог бы использовать?

4b9b3361

Ответ 1

Я предлагаю вам использовать keychain, как это:

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 для создания токенов доступа, которые утверждают некоторое количество претензий.