Javascript 如何将参数传递给ldapjs exop()函数?

Javascript 如何将参数传递给ldapjs exop()函数?,javascript,node.js,ldap,asn.1,ber,Javascript,Node.js,Ldap,Asn.1,Ber,我正在尝试使用“更改用户密码”扩展操作,该操作的定义是,它接受三个可选参数的序列。然而,ldapjs的client.exop()函数似乎只允许我为它提供一个字符串或缓冲区 这是我的尝试: const dn=`uid=${username},ou=People,dc=${orginization},dc=com` client.exop('1.3.6.1.4.1.4203.1.11.1',[dn,null,newPassword],(err,value,res)=>{ // ... }) 这就是

我正在尝试使用“更改用户密码”扩展操作,该操作的定义是,它接受三个可选参数的序列。然而,ldapjs的client.exop()函数似乎只允许我为它提供一个字符串或缓冲区

这是我的尝试:

const dn=`uid=${username},ou=People,dc=${orginization},dc=com`
client.exop('1.3.6.1.4.1.4203.1.11.1',[dn,null,newPassword],(err,value,res)=>{
// ...
})
这就是由此产生的错误:

TypeError: options.requestValue must be a buffer or a string

我应该如何将这些值编码成字符串?ldapjs文档提供的关于将参数传递给扩展操作的信息很少扩展的操作参数需要是使用BER标准编码的ASN.1值。这不是一项简单的任务,因此您可能需要一个额外的npm库,例如帮助完成此过程

在梳理了ldapjs的代码、阅读了大量关于ASN.1和LDAP如何使用ASN.1标准的内容以及一些尝试和错误之后,我终于能够解决这个问题。由于明显缺乏这方面的文档,我想我会分享我在stackoverflow上学到的东西,这样其他人就不必像我一样经历那么多麻烦

一个有效的例子 这将使用npm库对发送的数据进行编码

const { Ber } = require('asn1')

// ...

const CTX_SPECIFIC_CLASS = 0b10 << 6
const writer = new Ber.Writer()
writer.startSequence()
writer.writeString(dn, CTX_SPECIFIC_CLASS | 0) // sequence item number 0
// I'm choosing to omit the optional sequence item number 1
writer.writeString(newPassword, CTX_SPECIFIC_CLASS | 2) // sequence item number 2
writer.endSequence()
client.exop('1.3.6.1.4.1.4203.1.11.1', writer.buffer, (err, value, res) => {
  // ...
})
要查找所有可用函数,此库的作者要求您查看

误码率序列 序列用于描述具有特定形状的对象(一组键值对)。某些元素可能是可选的,而其他元素是必需的。I was following对其参数进行了如下描述。我们需要遵循此序列的接口,以便将密码重置参数发送到LDAP

PasswdModifyRequestValue ::= SEQUENCE {
  userIdentity    [0]  OCTET STRING OPTIONAL
  oldPasswd       [1]  OCTET STRING OPTIONAL
  newPasswd       [2]  OCTET STRING OPTIONAL }
[0]
[1]
[2]
都是指上下文特定的标签号。使用上下文特定标记1标记的值将被解释为oldPasswd参数的值。我们不需要使用全局字符串标记来表示我们的值是字符串类型的-LDAP已经可以使用我们所遵循的接口推断出该信息。这意味着在按此顺序写入字符串时,必须提供如下标记号,而不是像以前那样执行
writer.writeString('text')

writer.writeString('text')
const CTX_SPECIFIC_CLASS = 0b10 << 6
writer.writeString(newPassword, CTX_SPECIFIC_CLASS | 2) // The second optional parameter allows you to set a custom tag on the data being set (instead of the default string tag).
const CTX_SPECIFIC_CLASS=0b10