首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护Typeform Webhook Python

保护Typeform Webhook Python
EN

Stack Overflow用户
提问于 2019-11-30 07:14:45
回答 1查看 811关注 0票数 5

我正在尝试使用Python/Django/DRF接受Typeform的表单响应,并且由于无法使散列匹配,所以在验证web钩子请求时遇到了困难。

以下是Typeform的说明:

代码语言:javascript
复制
1. Using the HMAC SHA-256 algorithm, create a hash (using created_token as a key) of the entire received payload as binary.
2. Encode the binary hash in base64 format.
3. Add prefix sha256= to the binary hash.
4. Compare the created value with the signature you received in the Typeform-Signature header from Typeform.

authentication.py

代码语言:javascript
复制
class TypeformAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        typeform_signature = request.META.get('HTTP_TYPEFORM_SIGNATURE')
        data = request.body
        secret_key = os.environ.get('TYPEFORM_SECRET_KEY')

        if not typeform_signature:
            return None

        if typeform_signature:
            hash = hmac.new(bytes(secret_key, encoding='utf-8'), data, hashlib.sha256)
            actual_signature = 'sha256={}'.format(base64.b64encode(hash.digest()).decode())
            user = User.objects.get(username='typeform-user')
            if actual_signature == typeform_signature:
                 return(user, None)
            else:
                raise exceptions.AuthenticationFailed('Typeform signature does not match.')
        else:
            return None

示例有效载荷

代码语言:javascript
复制
{
  "event_id": "01DTXE27VQSA3JP8ZMP0GF9HCP",
  "event_type": "form_response",
  "form_response": {
    "form_id": "OOMZur",
    "token": "01DTXE27VQSA3JP8ZMP0GF9HCP",
    "landed_at": "2019-11-30T05:55:46Z",
    "submitted_at": "2019-11-30T05:55:46Z",
    "definition": {
      "id": "OOMZur",
      "title": "Auto Liability (New Company)",
      "fields": [
        {
          "id": "GnpcIrevGZQP",
          "title": "What is your business name?",
          "type": "short_text",
          "ref": "3e60e064-f14c-4787-9968-0358e8f34468",
          "properties": {}
        }
      ]
    },
    "answers": [
      {
        "type": "text",
        "text": "Lorem ipsum dolor",
        "field": {
          "id": "GnpcIrevGZQP",
          "type": "short_text",
          "ref": "3e60e064-f14c-4787-9968-0358e8f34468"
        }
      }
    ]
  }
}

Typeform生成的哈希

sha256=jdzKuFkijyBIMvmGyveHfcfzcNXUeQCuveNGP6CEdXk=

authentication.py生成哈希

sha256=at4SsBIi2IXJ8vr1Ix3tHW7iK9q5KQfx20EBa+l9wKU=

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-30 18:43:40

我能做到这点。以防万一有人在鉴定万事簿时遇到麻烦。我找到了这个指南并修改了它。

https://simpleisbetterthancomplex.com/tutorial/2016/10/31/how-to-handle-github-webhooks-using-django.html

而不是在身份验证中处理它。我改变了看法来处理这件事。

代码语言:javascript
复制
import hashlib
import hmac
import json
import base64
import os

@csrf_exempt
def inbound_application_create_view(request):

    header_signature = request.META.get('HTTP_TYPEFORM_SIGNATURE')
    if header_signature is None:
        return HttpResponseForbidden('Permission denied.')

    sha_name, signature = header_signature.split('=', 1)
    if sha_name != 'sha256':
        return HttpResponseServerError('Operation not supported.', status=501)

    mac = hmac.new(force_bytes(os.environ.get('TYPEFORM_SECRET_KEY')), msg=force_bytes(request.body), digestmod=hashlib.sha256)
    if not hmac.compare_digest(force_bytes(base64.b64encode(mac.digest()).decode()), force_bytes(signature)):
        return HttpResponseForbidden('Permission denied.')

    return HttpResponse('pong')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59114066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档