Node.js 使用客户端证书的FeatherJS身份验证
我正在尝试创建自己的身份验证策略,在FeatherJS后端读取客户端的PKI证书。这是在钩子之前的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()。我
中处理的,并且基于钩子所在的文档
钩子是独立于传输的,这意味着它是否通过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策略中