【问题标题】:secret or public key must be provided - IOS/Swift + Socket.io-JWT必须提供密钥或公钥 - IOS/Swift + Socket.io-JWT
【发布时间】: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()
    }



}

仅供大家理解

  1. 钥匙串的目的只是为了存储令牌,假设我已经保存了 来自登录用户的令牌,那么我将简单地执行此操作 keychain["token"] = "token",让我们假设令牌已经 已保存
  2. var token是获取token,因为目前keychain store 令牌是可选的,因此我需要进行可选绑定。
  3. 最后我实例化了一个套接字对象,这样我就可以传递令牌 作为参数,很多人建议这样做 .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 的样板代码

那么,真正的问题是,我做错了什么?

【问题讨论】:

    标签: ios swift socket.io jwt


    【解决方案1】:

    看起来您没有在服务器实现中提供秘密:

    socketioJwt.authorize({ secret: 'some secret here', // <-- handshake: true })

    【讨论】:

    • 如果我收到socket: [object Object],我还有一个问题要问你,我将如何获取数据?像 first_name 等等。因为每当我试图 console.log socket.decoded_token.first_name 它显示 undefined
    【解决方案2】:

    在您的 .env 中添加 JWT_SECRET=JWT_SECRET

    【讨论】:

    • 这需要安装dotenv 之类的东西,即使这样它只是将其设置为环境变量,您仍然需要使用@Wilson 指出的process.env.JWT_SECRET 显式设置它。跨度>
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2020-11-26
    • 2018-10-17
    • 2017-05-11
    相关资源
    最近更新 更多