我正在爲Shopify webhook實現一個簡單的Web服務,以使用Play2進行調用。我想使用包含的'X-Shopify-Hmac-Sha256'標頭參數來驗證來自Shopify的呼叫。Shopify驗證Scala中的webhook調用
Shopify文檔只包含一個Ruby和Php示例,不是很難翻譯我認爲。好吧,我似乎在掙扎。
這裏是我的簡單的斯卡拉shopify util對象:
import play.api.mvc.Request
import play.api.mvc.AnyContent
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import play.api.Logger
import javax.crypto.SecretKey
import org.apache.commons.codec.binary.Base64
object ShopifyUtils {
def verifyWebhookCall(request : Request[AnyContent], secretKey: String) : Boolean = {
if (!request.headers.get("X-Shopify-Hmac-Sha256").isDefined)
false
else
{
val headerHash = request.headers.get("X-Shopify-Hmac-Sha256").getOrElse("")
val body = request.body.asJson.get.toString
Logger.info("json '" + request.body.asJson.get.toString + "' = " + encode(secretKey, request.body.asJson.get.toString));
Logger.info("body '" + request.body.toString() + "' = " + encode(secretKey, request.body.toString))
Logger.info("headerHash " + headerHash);
val calcHash = encode(secretKey, body)
headerHash.equals(calcHash)
}
}
def encode(key: String , data: String): String = {
val sha256_HMAC = Mac.getInstance("HmacSHA256");
val secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
return new String(Base64.encodeBase64(sha256_HMAC.doFinal(data.getBytes))).trim
}
}
我生成散列是從來沒有作爲一個Shopify發送相同。
我的共享密鑰錯誤(我不明白它是怎麼回事),或者我沒有散列與Shopify相同的內容(我試過各種request.body
輸出格式)。
任何提示/指導/建議感激地收到。
添
感謝csaunders。是的你是對的,我沒有得到原始請求體,而是一個預先解析的版本。 – glidester