Аутентификация 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.