验证 Adonis Websocket 连接

Authenticate Adonis Websocket Connections

Adonis.js版本4.x

所以问题是我无法在 client-side 中添加授权 header 以使用中间件 Adonis/Middleware/Auth 来验证我的 JWT 令牌。

所以我做了一个客户中间件来授权套接字连接,我现在可以得到我传递的令牌。那么现在我该如何检查该令牌是否有效?我还没有看到关于这部分的任何好的文档,非常感谢您的帮助!

客户端

import Ws from '@adonisjs/websocket-client'

const ws = Ws('ws://0.0.0.0:3001', {
      path: 'adonis-ws'
})

const jwtToken = cookie.get('auth._token.local')

ws
   .withJwtToken(jwtToken)
   .connect()

服务器端

// start/socket.js
const Ws = use('Ws')
Ws.channel('order', 'OrderController').middleware(['socketAuth'])
// start/wsKernel.js
const Ws = use('Ws')

const namedMiddleware = {
  socketAuth: 'App/Middleware/SocketAuthentication'
}

Ws
  .registerGlobal(globalMiddleware)
  .registerNamed(namedMiddleware)
// app/Middleware/SocketAuthentication.js
class SocketAuthentication {
  async wsHandle ({ request, auth }, next) {
    try {
      const { token } = request.all()
      // Authenticate the error in this part :(
      await next()
    } catch (error) {
      console.log(error)
    }
  }
}

module.exports = SocketAuthentication

所以我只是使用 jsonwebtoken 插件来验证 jwt 令牌是否有效。

这里是中间件:

'use strict'
const Env = use('Env')
const jwt = require('jsonwebtoken')

class SocketAuthentication {
  /**
  * @param {object} ctx
  * @param {Request} ctx.request
  * @param {Function} next
  */
  async wsHandle ({ request, auth }, next) {
    const { token } = request.all()
    const appKey = auth.authenticatorInstance._config.options.secret
    const jwtToken = token.split(' ')[1]
    jwt.verify(jwtToken, appKey)
    await next()
  }
}

module.exports = SocketAuthentication