0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【@shopify/shopify-api】Received Invalid shop argumentの対処法

Last updated at Posted at 2022-11-25

はじめに

Shopifyの公式ライブラリを使って、認証認可を行うときにエラーがでたので今回はエラーとその対処法について書いていこうと思います。

ちなみにShopifyの公式ライブラリの他のエラーについても記事にしているのでよろしければご覧ください。

@shopify/shopify-api: Shopify.Context.initialize()がundefinedになる

この記事の対象者

  • Shopifyの公式ライブラリ「@shopify/shopify-api」を使っている人
  • Shopifyの認証認可で躓いている人

解決法だけ知りたい人へ

beginAuth()に渡すshopの引数をURLではなく、ドメイン名にする。

// 以下は動かない
// const shop = "[https://test-theme-jp.myshopify.com/](https://development-test-theme-jp.myshopify.com/)"

// ドメイン名で保存する
const shop = "[test-theme-jp.myshopify.com](https://development-test-theme-jp.myshopify.com/)"

実行環境

  • OS:Windows 11 Home 21H2
  • 言語
    • Node.js
      • version: 16.11.1
    • npm
      • version: 8.0.0
  • 使用しているライブラリ・フレームワーク
    • Express
      • version: 4.18.1
    • @shopify/shopify-api (shopify-api-node Shopify公式のライブラリ)
      • version: ^5.0.1

前提知識

shopify/shopify-apiとは?
  • Shopifyが提供するNode.js製のライブラリ。
  • Shopify Appのインストール時に発生するOAuth認証のフローを抽象化し、自分で一から実装するよりも短く、安全にOAuth認証~アクセストークン取得を実装することができる。
beginAuth()について
  • 概要
    • OAuth認証を始めるときに呼び出す関数。認証認可画面に遷移し、ユーザが認可を終えたあと、引数に渡したコールバックURLに認可コードが送られる。
  • 引数
    • request: HTTPリクエスト
    • response: HTTPレスポンス
    • shop: ストアのドメイン名
    • redirectPath: アプリ管理画面で指定したコールバックURL
    • isOnline: オンラインセッションかオフラインセッションかをbooleanで判定
  • 戻り値
    • 認証・認可画面へのURL

エラーの詳細

やりたかったこと

  • Shopifyが提供するAdmin APIへのアクセストークンを取得する
    • ユーザーが遷移する認証認可のURLを生成したい。
    • このドキュメントで、認証認可のURLを生成するbeiginAuth()を実行してユーザーを認証画面にリダイレクトしたい。

発生したエラー(上手くいかなかったこと)

  • beginAuth()を実行すると、Received Invalid shop argumentというエラーが発生した。
    • shopに渡している値が正しくないと怒られる。
    • 公式ドキュメントでは、shopの値を環境変数で管理してそれを読み取ってbeginAuth()に渡しており、自分も同じように実装した。
      • Expressで実装しています。

コード例

import dotenv from 'dotenv'

dotenv.config()

// 環境変数の読み取り
const { API_KEY, API_SECRET_KEY, SCOPES, SHOP, HOST, HOST_SCHEME } = process.env;

/*       途中の処理は割愛        */

router.get('/login', async(req, res) => {
    console.log(SHOP)
    let authRoute = await Shopify.Auth.beginAuth(
        req,
        res,
				// ここで渡している値が正しくないと怒られる 
        SHOP,
        '/shopify/auth/callback',
        false,
      );
      return res.redirect(authRoute);
})

調査

1 環境変数が読み取れるかをConosoleで確認する
  • 環境変数で取得したSHOPの中身をbeginAuth()の直前で確認する。ここでundefinedになっていないかを確認。
  • Consoleで確認したところ、https://test-theme-jp.myshopify.com/ だった。
2 公式ドキュメントを読み直す

調査結果、エラーの原因

  • すごいややこしいが、beginAuth()に渡すshop名はドメイン名でないといけない。
    • 環境変数の方にはurlと書いてあったので自分はそっちを保存していた。
    • 公式ドキュメント分かりづらい。。

エラーの解決法

おわりに

ちゃんとライブラリが用意している関数やクラスなどの仕様を見ておくことが大事だと改めて痛感しました。

とはいえ、あの記述の仕方だと勘違いしてしまうので修正してほしいですね。。

【参考にしたサイト・動画等】

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?