Node.js 使用客户端证书的FeatherJS身份验证

Node.js 使用客户端证书的FeatherJS身份验证,node.js,feathersjs,feathers-authentication,Node.js,Feathersjs,Feathers Authentication,我正在尝试创建自己的身份验证策略,在FeatherJS后端读取客户端的PKI证书。这是在钩子之前的中处理的,并且基于钩子所在的文档 钩子是独立于传输的,这意味着它是否通过HTTP(S)(REST)、Socket.io、Primus或将来可能支持的任何其他传输特性被调用并不重要。它们也是服务不可知的,这意味着它们可以与​任何​ 服务,无论他们是否有型号 这不是一个坏主意,但是我需要钩子中的TLS套接字结构来获取用户证书。本质上调用:req.socket.getPeerCertificate()。我

我正在尝试创建自己的身份验证策略,在FeatherJS后端读取客户端的PKI证书。这是在钩子之前的
中处理的,并且基于钩子所在的文档

钩子是独立于传输的,这意味着它是否通过HTTP(S)(REST)、Socket.io、Primus或将来可能支持的任何其他传输特性被调用并不重要。它们也是服务不可知的,这意味着它们可以与​任何​ 服务,无论他们是否有型号

这不是一个坏主意,但是我需要钩子中的TLS套接字结构来获取用户证书。本质上调用:
req.socket.getPeerCertificate()
。我正在使用
passport客户端证书
模块,下面是有问题的策略:

class ClientCertStrategy extends Strategy {
  constructor (options, verify) {
    if (typeof options === 'function') {
      verify = options
      options = {}
    }
    if (!verify) throw new Error('Client cert authentication strategy requires a verify function')

    super()

    this.name = 'client-cert'
    this._verify = verify
    this._passReqToCallback = options.passReqToCallback
  }

  _verified (err, user) {
    if (err) { return this.error(err) }
    if (!user) { return this.fail() }
    this.success(user)
  }

  authenticate (req, options) {
    // Requests must be authorized
    // (i.e. the certificate must be signed by at least one trusted CA)
    if (!req.socket.authorized) {
      this.fail()
      return
    }

    // This is where it fails! req.socket does not exist
    const clientCert = req.socket.getPeerCertificate()

    if (!clientCert) {
      this.fail()
      // TODO: Failure message
      // this.fail({message: options.badRequestMessage || 'Missing client     certificate'}, 400)
      return
    }

    try {
      if (this._passReqToCallback) {
        this._verify(req, clientCert, this._verified.bind(this))
      } else {
        this._verify(clientCert, this._verified.bind(this))
      }
    } catch (err) {
      return this.error(err)
    }
  }
}

基于FeathersJS代码,
authenticate
函数基本上从
钩子
生成一个新的请求对象。有没有什么方法可以提前获取用户证书,并在稍后执行钩子时使其可用?

我写了一个问题,并被指向FAQ,它最终帮助我解决了这个问题:

我最终编写了一个中间件,将证书粘贴到请求
参数中。请求
params
被复制到钩子中,然后被传递到Passport策略中