em Tecnologia

Autenticação do Mandrill Webhook com Python Flask

Mandrill é um serviço para disparo de emails transacionais, ele possui relatórios e você pode receber os eventos de cada mensagem (enviado, aberto, click em link, etc) enviada via Webhook.

Procurando uma forma de autenticar o Webhook do Mandrill com Python, o qual eu já havia feito com PHP, eu encontrei esse artigo que mostrava como fazer utilizando o framework Webapp2 e usando uma versão 2.7 do Python. Como eu utilizo Flask com Python 3.4, tive que fazer algumas modificações, mas consegui fazer funcionar.

Segue o trecho de código que estou utilizando:

def calc_mandrill_signature(raw, key):
    import hashlib
    import hmac
    import base64

    digest = hmac.new(key.encode('utf-8'), raw.encode('utf-8'), hashlib.sha1).digest()
    hashed = base64.encodestring(digest).decode("utf-8").rstrip('\n')
    return hashed

def verify_mandrill_signature(request):
    '''
    Mandrill includes an additional HTTP header with webhook POST requests,
        X-Mandrill-Signature, which will contain the signature for the request.
        To verify a webhook request, generate a signature using the same key
        that Mandrill uses and compare that to the value of the
        X-Mandrill-Signature header.
    :return: True if verified valid
    '''
    mandrill_signature = request.headers['X-Mandrill-Signature']
    mandrill_key = 'aqui vai a API key do seu webhook'
    signed_data = request.url
    sorted_key = sorted(request.form)
    for k in sorted_key:
        signed_data += k
        signed_data += request.form[k]
    expected_signature = calc_mandrill_signature(signed_data, mandrill_key)
    return expected_signature == mandrill_signature

@app.route('/webhook', methods=['POST'])
def event_webhook():
    if not verify_mandrill_signature(request):
        abort(403)

    import json
    data = json.loads(request.form['mandrill_events'])

    for e in data:
        '''
        Insira o que você quiser fazer com os resultados dos eventos...
        '''

Deixe um comentário

Comentário