1

我正在尝试使用他们的 Valence API 从 3rd 方应用程序中修改 D2L 数据库。我已经完成了一些操作,但我一直在尝试创建一个新的用户帐户。有人告诉我,我正在使用的帐户有权执行此操作。

我定义了一个 JSON 对象来保存我想要的值: { "OrgDefinedId": "XX000TEST", "FirstName": "Tom", "MiddleName": "", "LastName": "Foolery", "ExternalEmail": “tom@something.com”、“用户名”:“Tom.Foolery”、“RoleId”:“78”、“IsActive”:“true”、“SendCreationEmail”:“false”}

我将上述文本复制到 HTTP 发布缓冲区,然后调用以下链接:/d2l/api/lp/1.0/users/?

参数字符串包含在 Valence 文档中指定的 ID 和签名(x_a、x_b 等)。我假设授权值是正确的,因为在其他 Valence 查询上使用相同的算法时我得到了正确的结果。

任何有关如何通过“无效令牌”消息的建议将不胜感激。

——斯坦

4

1 回答 1

2

如果您收到 403“无效令牌”消息,那么由于某种原因,您没有正确形成 x_a、x_b、x_c 或 x_d 身份验证令牌。我们过去看到的常见问题是:

  • 尝试重用为一个 API 调用生成的 x_c 和/或 x_d 签名与另一个

  • 交换令牌:x_a 是 App ID,x_c 是 App Sig,x_b 是 User ID,x_d 是 User Sig

  • 使用错误的 HTTP方法生成签名(该方法是签名的基本字符串的组成部分之一)

  • 基本字符串中的 HTTP 方法不使用全部大写字母(组件不应GETget

  • 没有在基本字符串中对 API 路由使用所有小写字母,或者包含不正确的字符:例如,在您的问题中,您似乎暗示您正在?作为路由的一部分传递;你不应该这样做。在这种情况下,您用于创建 URL 的基本字符串应该在POST&/d2l/api/lp/1.0/users/&1234567where1234567应该替换为您生成的时间戳并传入 x_t

  • 使用提供 API 版本组件的 API 路由,但在调用时,使用另一个版本组件(即生成时使用/d2l/api/lp/1.0/...但调用时使用/d2l/api/lp/1.1/...

  • 在基本字符串中使用不正确/不匹配的时间戳值(用于基本字符串的时间戳应以秒为单位,并且与 x_t 值相同)

  • 虽然之前调用有效,但突然之间没有一个调用使用 403 无效令牌结果:用户令牌可能已过期,您需要重新验证用户

  • 虽然调用以前针对测试实例有效,但当您尝试移动到不同的 LMS(例如 prod 实例)时,调用不起作用:可能 App ID/Key 对没有出现在这个新的 LMS 上,或者您重新尝试使用来自一个 LMS 的用户 ID/密钥对在不同的 LMS 上生成签名

另外,请注意您的 JSON 对象的格式严格不正确:IsActiveandSendCreationEmail属性应该分别具有 and 的值,truefalse不是"true"and "false",尽管服务器端的 LMS 解析器可能会原谅这一点。

如果这些要点都不能帮助您,请随时在我们的问题跟踪器中打开问题,或联系我们的 Valence 支持电子邮件地址,我们可以尝试帮助您解决此问题。

注意请注意,无效的令牌会让您返回 403(但消息将是“无效令牌”或“过期令牌”或类似消息)。如果您的令牌正确生成,但您的调用用户上下文不允许创建用户,那么您也会收到 403,但这次消息将是“不允许”或“未授权”或类似的消息。确保您仔细检查您返回的 403类型。

在这种特殊情况下,创建用户的权限有点棘手。您不仅必须有权创建用户,还必须有权修改您将在 CreateUserData 结构(OrgDefinedId、Email 等)中传递给 API 的属性,并且您还必须能够查看“用户信息隐私”设置中的所有这些字段,并且您必须有权注册您在组织级别提供的用户角色……最后两位过去曾让我们的一些客户感到不安。

于 2013-01-05T00:21:46.683 回答