Play2 を使用して呼び出すための Shopify Webhook 用の単純な Web サービスを実装しています。含まれている「X-Shopify-Hmac-Sha256」ヘッダー パラメーターを使用して、Shopify からの呼び出しであることを確認したいと考えています。
Shopify ドキュメントには Ruby と Php のサンプルのみが含まれており、翻訳するのはそれほど難しくないと思いました。うーん、苦戦しているようです。
これが私の単純な Scala 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
出力形式を試しました)。
感謝して受け取ったヒント/ガイド/提案。
ティム