Shopify MultipassでSSOしたら、都道府県とログアウトでハマった思い出話
Shopify Plus限定の「Multipass Login」でSSOを実装してみたら、実装そのものは拍子抜けするほど簡単でした。
しかし、細かいところで地味に時間を吸われる仕様がありました。
特にハマったのがこの2点です。
- 都道府県が正しく連携されない
- ログアウトができない
Multipass自体の情報は多いですが、この2点に触れている記事はほとんどなかったので、備忘録としてまとめておきます。
Multipass Loginとは
Shopify Plusで使えるSSO機能で、外部サイトのユーザーをShopifyストアにログインさせる仕組みです。
仕組みはシンプルで、JWTトークンを暗号化してHMAC署名し、Shopifyに渡すだけです。
ドキュメント通りにやれば数分で動きます。
const payload = {
  email: "user@example.com",
  first_name: "竜也",
  last_name: "兵藤",
  return_to: "https://your-store.myshopify.com/account",
};
このpayloadを暗号化 → HMAC署名 →
https://your-store.myshopify.com/account/login/multipass/{token} にリダイレクトすればログインできます。
ここまでは問題なし。
本当の戦いは「住所を渡した時」から始まります。
都道府県が連携されない問題
最初はこんな感じで住所情報を渡していました。
address1: "六本木1-2-3",
city: "港区",
province: "東京都",
province_code: "13",
country: "Japan",
country_code: "JP"
結果、Shopifyストアのマイページには都道府県が空欄。
市区町村までは入っているのに、都道府県だけスルーされます。
試しに "Tokyo" や "TOKYO" にしてもダメ。
ISOコード形式にしても反映されない。
いろいろ試してやっと分かりました。
正解はこれです。
'country' => 'Japan',
'country_code' => 'JP',
'province' => 'Tōkyō',
'Province code' => '13',
はい、「Tōkyō」です。
謎のローマ字表記で、長音符つき。
しかも「Province code」だけなぜかスネークケースではない。
ほんと最低な仕様。
Shopifyの公式ドキュメントにはこの仕様が一切書かれていません。
唯一このQ&Aで上記情報を見つけられました。ありがとう、ありがとう・・!
「Japanを指定したら都道府県ぐらい自動で判定してくれるだろう」と思ったら全くしてくれません。
ローマ字の表記をミスると無言で無視されます。
英語表記一覧を置いておきます。
    'prefecture_en_list' => [
        1 => 'Hokkaidō',
        2 => 'Aomori',
        3 => 'Iwate',
        4 => 'Miyagi',
        5 => 'Akita',
        6 => 'Yamagata',
        7 => 'Fukushima',
        8 => 'Ibaraki',
        9 => 'Tochigi',
        10 => 'Gunma',
        11 => 'Saitama',
        12 => 'Chiba',
        13 => 'Tōkyō',
        14 => 'Kanagawa',
        15 => 'Niigata',
        16 => 'Toyama',
        17 => 'Ishikawa',
        18 => 'Fukui',
        19 => 'Yamanashi',
        20 => 'Nagano',
        21 => 'Gifu',
        22 => 'Shizuoka',
        23 => 'Aichi',
        24 => 'Mie',
        25 => 'Shiga',
        26 => 'Kyōto',
        27 => 'Ōsaka',
        28 => 'Hyōgo',
        29 => 'Nara',
        30 => 'Wakayama',
        31 => 'Tottori',
        32 => 'Shimane',
        33 => 'Okayama',
        34 => 'Hiroshima',
        35 => 'Yamaguchi',
        36 => 'Tokushima',
        37 => 'Kagawa',
        38 => 'Ehime',
        39 => 'Kōchi',
        40 => 'Fukuoka',
        41 => 'Saga',
        42 => 'Nagasaki',
        43 => 'Kumamoto',
        44 => 'Ōita',
        45 => 'Miyazaki',
        46 => 'Kagoshima',
        47 => 'Okinawa',
    ]
ログアウトできない問題
もう一つハマったのがログアウト。
Multipassは「ログイン専用」の仕組みで、ログアウトは提供されていません。
外部サイトでセッションを切っても、Shopify側のログインは生きたまま。
結果、再ログインしても同じユーザーが勝手に復活します。
「logout API があるはず」と思って探してもありません。
「Shopify Admin APIでセッションを無効化できるのでは?」と思ってもできません。
結論として、Shopifyの/account/logoutにリダイレクトするという力技で解決できるようでした。
app.get("/logout", (req, res) => {
  req.session.destroy();
  res.redirect("https://your-store.myshopify.com/account/logout");
});
外部システムとShopifyの両方のセッションをここで削除します。
共通のログアウトページを用意して、両方の処理をまとめるのが一番シンプルです。
まとめ
Multipassは動くには動く。
ただし、気持ちよくは動かない。
- 都道府県は「Tōkyō」とかいう謎の表記を要求される
- 「Province code」だけキャメルケースという不思議仕様
- ログアウトは自前で処理しないと残る
実装自体は簡単でも、細部でつまずく。
これからMultipassを使う人は、英語表記の沼とログアウト問題に気をつけてください。

あなたの情熱を確かなカタチに。 心躍る「クリエイティブ」に専念できる環境を!テクノロジーを駆使して誰かの創造性を爆上げする! ワンフレーム株式会社のエンジニアブログです! コーポレートサイトはこちら→ oneframe.co.jp/




Discussion