Liquid、JavaScriptなどに関する質問
やりたいこと
アプリにFlow actionの拡張機能を追加し、呼び出された際にgraghqlを使用した処理を行いたいです。
前提条件
アプリのテンプレート:Remix
不明な点
管理画面からリクエストした場合、下記コードで認証する形になります。
このとき取得した`admin`を使用してgraphqlを使用できるようになると思います。
```
```
上記のようなFlow actionからのリクエストを認証するメソッドはありますでしょうか。
詳しい方おられましたら教えていただきたいです。
https://shopify.dev/docs/apps/flow/actions/endpoints#verifying-requests
解決済! ベストソリューションを見る。
成功
以下のコードでできました。注意点としては、呼び出す処理のルートはapp配下にすることです。
例)app-directory/app/routes/app/api/action.js
そうしなければGraphqlが認証されず、"[API] Invalid API key or access token (unrecognized login or wrong password)"のエラーになります。
import { unauthenticated } from "~/shopify.server";
// Includes crypto module
const crypto = require("crypto");
export const action = async ({ request }) => {
// HMAC検証
const rawBody = await request.text();
const hmacHeader = request.headers.get("X-Shopify-Hmac-SHA256");
const hmac = await crypto.createHmac("sha256", process?.env?.SHOPIFY_API_SECRET);
const hash = await hmac.update(rawBody, "utf8").digest("base64");
// console.log("signature match : " + (hash == hmacHeader));
if(hash !== hmacHeader) {
return new Response(undefined, {
status: 401,
statusText: 'Unauthorized'
});
}
const data = JSON.parse(rawBody);
if(data.handle !== "handle") {
return new Response(undefined, {
status: 405,
statusText: 'Method Not Allowed'
});
}
const { admin } = await unauthenticated.admin(data.shopify_domain);
const response = await admin.graphql(
`#graphql
query {
shop{
name
}
}
}`);
const responseJson = await response.json();
console.log(responseJson);
return null;
};
成功
以下のコードでできました。注意点としては、呼び出す処理のルートはapp配下にすることです。
例)app-directory/app/routes/app/api/action.js
そうしなければGraphqlが認証されず、"[API] Invalid API key or access token (unrecognized login or wrong password)"のエラーになります。
import { unauthenticated } from "~/shopify.server";
// Includes crypto module
const crypto = require("crypto");
export const action = async ({ request }) => {
// HMAC検証
const rawBody = await request.text();
const hmacHeader = request.headers.get("X-Shopify-Hmac-SHA256");
const hmac = await crypto.createHmac("sha256", process?.env?.SHOPIFY_API_SECRET);
const hash = await hmac.update(rawBody, "utf8").digest("base64");
// console.log("signature match : " + (hash == hmacHeader));
if(hash !== hmacHeader) {
return new Response(undefined, {
status: 401,
statusText: 'Unauthorized'
});
}
const data = JSON.parse(rawBody);
if(data.handle !== "handle") {
return new Response(undefined, {
status: 405,
statusText: 'Method Not Allowed'
});
}
const { admin } = await unauthenticated.admin(data.shopify_domain);
const response = await admin.graphql(
`#graphql
query {
shop{
name
}
}
}`);
const responseJson = await response.json();
console.log(responseJson);
return null;
};
サポートの選択肢が増えていく中、最適となる選択の判断が難しくなっているかと存じます。今回は問題の解決に最適となるサポートの選択方法を、紹介させて頂きます。 選択肢のご紹介...
By Mirai Oct 7, 20242023年初頭、Shopifyペイメントアカウント、及びShopifyアカウント全体のセキュリティを強化する為の変更が適用されました。ユーザーのアカウントセキュリティを強化す...
By Mirai Sep 30, 2024概要: 年末/年明けは、消費者が最もショッピングを行う時期の一つです。特に、ブラックフライデー・サイバーマンデー(BFCM)は、世界中で注目される大規模なセールイベントであ...
By JapanGuru Sep 25, 2024