# 为 Webhook 添加授权头？

**URL:** https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013
**Category:** Development
**Created:** [2020年二月7日 19:14 UTC](https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013 "2020-02-07T19:14:22Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![davidnewkerk](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/davidnewkerk/32/171224_2.png) [@davidnewkerk](https://meta.discourse.org/u/davidnewkerk)
#### Post date: [2020年二月7日 19:14 UTC](https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013/1 "2020-02-07T19:14:22Z")

</div>

我正在尝试将 Mailchimp 新闻订阅选项集成到新用户注册流程中，并已通过使用 @pfaffman 提供的此插件取得了一些进展：[GitHub - pfaffman/discourse-mailchimp-webhook · GitHub](https://github.com/pfaffman/discourse-mailchimp-webhook)

该插件成功添加了一个“用户创建事件”（User Created Event）网络钩子，该钩子出现在 `/admin/api/web_hooks/new` 页面。我根据 [Mailchimp API 文档](https://mailchimp.com/developer/guides/manage-subscribers-with-the-mailchimp-api/#Add_a_Contact_to_a_List%2FAudience) 配置了网络钩子的 Payload URL，格式如下（使用我实际的 DC 和列表 ID）：  
`https://[my-dc].api.mailchimp.com/3.0/lists/[my-list-id]/members/`

我创建了一个新用户，网络钩子成功触发，但 Mailchimp 返回了“API Key Invalid”（API 密钥无效）的响应。通过阅读 [build\_webhook\_headers](https://github.com/discourse/discourse/blob/master/app/jobs/regular/emit_web_hook_event.rb#L130) 方法的代码，我发现将 API 密钥添加到“Secret”字段似乎不起作用，因为这样只会生成一个“X-Discourse-Event-Signature”头部。不过我还是试了一下，结果仍然相同。

作为测试，我手动编辑了 `build_webhook_headers` 方法，插入了 Mailchimp API 所期望的授权头部，结果成功了（我收到了成功响应，并且新成员也出现在 Mailchimp 端）：

`headers['Authorization'] = 'apikey my-key-here'`

显然，直接修改 Discourse 代码并不是可行的解决方案。但我现在卡住了，不知道如何将这个授权头部添加到我的网络钩子请求中。看起来可以通过 `:after_build_web_hook_body` 来增强请求体，但我尚未找到类似的方式来操作请求头。

如果有任何指引能帮我找到正确的方向，我将不胜感激。谢谢！

---

<div class="post-metadata">

### Author: ![davidnewkerk](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/davidnewkerk/32/171224_2.png) [@davidnewkerk](https://meta.discourse.org/u/davidnewkerk)
#### Post date: [2020年二月29日 15:46 UTC](https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013/2 "2020-02-29T15:46:03Z")

</div>

想跟进一下，看看是否有人知道这个问题的解决方案……我还没能解决。我暂时通过插件重写了 `Jobs::EmitWebHookEvent` 类中的 `build_webhook_headers` 方法，不过我知道这并不是一个理想的方案。

提前感谢！

---

<div class="post-metadata">

### Author: ![marcpp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcpp/32/178809_2.png) [@marcpp](https://meta.discourse.org/u/marcpp)
#### Post date: [2020年四月30日 15:20 UTC](https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013/3 "2020-04-30T15:20:38Z")

</div>

大家好，

那么，无法在我的 webhook 上设置 `Authorization` 头吗？

webhook 的用途是什么呢？感觉 99% 有用的 webhook 都需要这个头。

🤨

---

<div class="post-metadata">

### Author: ![tomve](https://avatars.discourse-cdn.com/v4/letter/t/9f8e36/32.png) [@tomve](https://meta.discourse.org/u/tomve)
#### Post date: [2020年十二月1日 10:20 UTC](https://meta.discourse.org/t/adding-an-authorization-header-for-a-webhook/141013/4 "2020-12-01T10:20:18Z")

</div>

我有一个类似的需求，需要将新用户的信息发送到 Mailchimp 列表，并遇到了上述相同的问题。但我已经找到了该问题的解决方案/变通方法。

由于 Mailchimp API 在提供 API 密钥时使用的是 [HTTP 基本认证](https://mailchimp.com/developer/guides/marketing-api-conventions/#authentication-methods)，您也可以将密钥包含在调用的 [URL](https://en.wikipedia.org/wiki/Basic_access_authentication#URL_encoding) 中（而不是更常见的 Authorization 请求头）。

因此，在我的情况下，我将 Webhook 负载 URL 设置为：  
`https://user:[my-api-key]@[my-dc].api.mailchimp.com/3.0/lists/[my-list-id]/members/`

这似乎运行良好，因为新用户现在已成功添加到 Mailchimp 列表中。
