AWS Лямбда-проверка запросов от Slack - PullRequest
3 голосов
/ 29 мая 2020

У меня есть следующий код Python в AWS Lambda, чтобы проверить, действительно ли полученное событие от Slack:

   import hmac
   import json
   def verifySignature(header,body):
        h = hmac.new(key=os.getenv('sign_secret').encode(), \
            msg=f'v0:{header.get("X-Slack-Request-Timestamp")}:{body}'.encode(), \
            digestmod="sha256")
        result = hmac.compare_digest('v0='+h.hexdigest(),header.get('X-Slack-Signature'))
        print('v0='+h.hexdigest(),header.get('X-Slack-Signature'))
        return result

    def lambda_handler(event, context):
        body = json.loads(event.get('body'))
        if verifySignature(event.get('headers'),body):
            do_something()

Протокол аутентификации Slack обозначен здесь . Однако я продолжаю получать несовпадающие подписи (результат == False). Кто-нибудь знает почему?

1 Ответ

2 голосов
/ 29 мая 2020

Существует высокая вероятность того, что проблема связана с кодированием / декодированием. Существует пакет pip для проверки подписи слабины.

Но код проверки прост:

import hashlib
import hmac

def verify_slack_signature(slack_post_request, slack_signing_secret):
    slack_signing_secret = bytes(slack_signing_secret, 'utf-8')
    slack_signature = slack_post_request['headers']['X-Slack-Signature']
    slack_request_timestamp = slack_post_request['headers']['X-Slack-Request-Timestamp']
    request_body = slack_post_request["body"]

    basestring = f"v0:{slack_request_timestamp}:{request_body}".encode('utf-8')
    my_signature = 'v0=' + hmac.new(slack_signing_secret, basestring, hashlib.sha256).hexdigest()

    return hmac.compare_digest(my_signature, slack_signature)
...