我想使用 SOAP API 创建 Zimbra 用户帐户,但无法让它工作 - 这很奇怪,因为我可以获得 AuthToken,甚至可以使用以下命令查看已创建的帐户的信息(通过管理面板)请求GetAccountRequest,但是创建帐户不起作用。
这是我的 AuthToken (POST) 请求代码:
Header: Content-Type: application/soap+xml
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header xmlns="urn:zimbra">
<context></context>
</soap:Header>
<soap:Body>
<AuthRequest xmlns="urn:zimbraAdmin" password="myPassword">
<account by="adminName">[email protected]</account>
</AuthRequest>
</soap:Body>
</soap:Envelope>
这有效,我拿回了身份验证令牌。
接下来我尝试使用此(POST)请求创建新的用户帐户:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header xmlns="urn:zimbraAdmin">
<context>
<authToken> 0_69cd602eef3cf46bb488b02c6a173da698d17bdb_69643blablaTherestofmyauthtoken</authToken>
</context>
</soap:Header>
<soap:Body>
<CreateAccountRequest xmlns="urn:zimbraAdmin" name="[email protected]" password="john123!">
<a n="givenName">John</a>
<a n="sn">Doe</a>
<a n="displayName">John Doe</a>
</CreateAccountRequest>
</soap:Body>
</soap:Envelope>
这是我得到的回应:
SimpleXMLElement Object
(
[soap:Code] => SimpleXMLElement Object
(
[soap:Value] => soap:Sender
)
[soap:Reason] => SimpleXMLElement Object
(
[soap:Text] => no valid authtoken present
)
[soap:Detail] => SimpleXMLElement Object
(
[Error] => SimpleXMLElement Object
(
[Code] => service.AUTH_REQUIRED
[Trace] => btpool0-3022://zimbra.mydomain.com:7071/service/admin/soap:1449756733826:bc04a0eab6d6c7ec:SoapEngine368
)
)
)
有人可以帮助我吗?谢谢..
所以我想通了 - 当您发出 AuthToken 请求时,您会收到一个带有 AuthToken 值的 cookie,当您尝试创建新用户帐户时,您必须将该 cookie 发送回标头部分,如下所示:
Cookie: ZM_ADMIN_AUTH_TOKEN=0_69cd602eef3cf46bb488b02c6a173da698d17bdb_69643blablaTherestofmyauthtoken
整个请求必须如下所示:
$request= array(
'http' => array(
'method' => 'POST',
'header' => array(
'Content-Type: application/soap+xml',
'Cookie: ZM_ADMIN_AUTH_TOKEN=0_69cd602eef3cf46bb488b02c6a173da698d17bdb_69643blablaTherestofmyauthtoken',
),
'timeout' => 20,
'ignore_errors' => true,
'content' => '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header xmlns="urn:zimbraAdmin">
<context>
<authToken> 0_69cd602eef3cf46bb488b02c6a173da698d17bdb_69643blablaTherestofmyauthtoken</authToken>
</context>
</soap:Header>
<soap:Body>
<CreateAccountRequest xmlns="urn:zimbraAdmin" name="[email protected]" password="john123!">
<a n="givenName">John</a>
<a n="sn">Doe</a>
<a n="displayName">John Doe</a>
</CreateAccountRequest>
</soap:Body>
</soap:Envelope>
',
),
);
在文档中解释了需要管理员授权令牌,但它没有说明您必须在请求标头中通过 cookie 将其发回。
Zimbra 提供了两种获取 AuthToken 的方法:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:zimbraAccount">
<soap:Header/>
<soap:Body>
<urn:AuthRequest>
<urn:account by="name">${email}</urn:account>
<urn:password>${password}</urn:password>
</urn:AuthRequest>
</soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns="urn:zimbraAdmin">
<soap:Header/>
<soap:Body>
<AuthRequest xmlns="urn:zimbraAdmin">
<account by="name">${email}</account>
<password>${password}</password>
</AuthRequest>
</soap:Body>
</soap:Envelope>
注意:请求中的两个令牌有效负载相似,但管理令牌的命名空间更改为 urn:zimbraAdmin。
使用 Admin API 时,必须获取 AdminToken。文档在标头中指定了所需的命名空间,通常标记为 Service:
只要命名空间为“urn:zimbraAdmin”,就必须使用管理令牌。
要创建帐户,请使用以下示例:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns="urn:zimbraAdmin">
<soap:Header/>
<context xmlns="urn:zimbraAdmin">
<authToken>${authAdminToken}</authToken>
</context>
<soap:Body>
<CreateAccountRequest name="${email}" password="${password}">
</CreateAccountRequest>
</soap:Body>
</soap:Envelope>