Аутентификация FeathersJS с использованием сертификата клиента

Я пытаюсь создать свою собственную стратегию аутентификации, которая считывает сертификат PKI клиента в бэкэнде FeathersJS. Это обрабатывается в before крюк и на основе документации крючки

Хук не зависит от транспорта, а это означает, что не имеет значения, был ли он вызван через HTTP(S) (REST), Socket.io, Primus или через любой другой транспорт, который может поддерживать Перо в будущем. Они также не зависят от сервиса, что означает, что их можно использовать с любым сервисом независимо от того, есть у него модель или нет.

Это неплохая идея, однако мне нужна структура сокетов TLS в хуке, чтобы получить сертификат пользователя. По сути звонит: req.socket.getPeerCertificate(), Я использую passport-client-certificate модуль и вот стратегия, о которой идет речь:

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 функция в основном делает новый объект запроса из hook, Есть ли способ получить сертификат пользователя раньше и сделать его доступным позже, когда выполняется ловушка?

1 ответ

I wrote an issue and was pointed to the FAQ which ultimately helped me solve this:

https://github.com/feathersjs/authentication/issues/693

https://docs.feathersjs.com/faq/readme.html

I ended up writing a middleware that stuck the certificate into the request params, Запрос params are copied into the hook which is then passed into the Passport strategy.

Другие вопросы по тегам