2015-04-07 3 views
3

У меня есть приложение Rails, которое настроено на получение webhook от WooCommerce. В частности, я ищу, когда создается заказ. Я проверил и проверил, что он работает, когда у меня есть защита_from_forgery, кроме create. Теперь я пытаюсь защитить свое приложение, проверив webhook. Документация WooCommerce гласит следующее секрета передается в заголовке запроса:Проверка запроса Webhook

секрет: дополнительный секретный ключ, который используется для создания HMAC-SHA256 хэша тела запроса, так что получатель может проверить подлинность веб-крюк

WooCommerce github doc

в данный момент я не знаю, как я полагаю, чтобы проверить запрос, а затем действовать по нему. И если запрос не имеет права отклонить его с 401. Вот что я пытаюсь:

class HooksController < ApplicationController 

    protect_from_forgery 
    before_action :restrict_access 

    def order_created_callback 
    ... 
    end 

    private 

    SHARED_SECRET = 'my_secret_key' 

    def verify_webhook(data, hmac_header) 
     digest = OpenSSL::Digest::Digest.new('sha256') 
     calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, SHARED_SECRET, data)).strip 
     calculated_hmac == hmac_header 
    end 

    def restrict_access 
     data = request.body.read 
     verified = verify_webhook(data, env["X-WC-Webhook-Signature"]) 
     head :unauthorized unless verified 

    end 
end 

Но до сих пор я не увенчались успехом. Любой вход был бы весьма признателен. Благодарю.

+0

Я не могу предложить решение, но то, что вы делаете, кажется совершенно нормальным. В большинстве случаев у меня есть эта проблема, это что-то немое, как странная новая строка, но я вижу, что вы вызываете «strip» в конце. –

ответ

3

Хорошо, я понял вопрос, который у меня был. В случае, если кто-то еще пытается работать с веб-крюком WooCommerce, кажется, что моя проблема была соответствующим образом захвата файла заголовка запроса в соответствии с его рассчитанным HMAC.

SHARED_SECRET = "my_secret" 

def verify_webhook(data, hmac_header) 
    hash = OpenSSL::Digest::Digest.new('sha256') 
    calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(hash, SHARED_SECRET, data)).strip 
    calculated_hmac == hmac_header 
end 

def restrict_access 
    data = request.body.read 
    head = request.headers["X-WC-Webhook-Signature"] 
    verified = verify_webhook(data, head) 
    if verified 
     return 
    else 
     render nothing: true, status: :unauthorized 
    end 
end 
+1

«Дайджест: дайджест устарел, используйте дайджест» (из журнала) – Cleverlemming

Смежные вопросы