Google を IdP とした Shopify の SAML を用いた SSO 設定方法

tty
Belong blog
Published in
15 min readMar 16, 2022

tty です。本記事では Shopify と Google の SSO を行う方法について紹介します。

2022年2月の時点で方法は Google 検索して Shopify と Google で直接 SSO する方法は全くありませんでした。(3rd ベンダーアプリを購入すれば可能そうです)
最終的には成功しましたが、調べ始めてから完了までかかった日数 25日、カナダに居ると思われるサポートエンジニアとメールを交わすこと 20通以上の一筋縄ではいかない作業でした。

まずは方法を紹介し、詰まったポイント毎のエピソードを後述します。

Shopify と Google の SSO の方法

前提

  1. Google Admin の特権ユーザー(SAML アプリを作成する権限)を持っていること
  2. Shopify Plus に入っており、 User managementAll Permission を持っていること

以下は必要な情報の取得順序に沿って Shopify と Google での作業を交互に行います。

1.Shopify の準備

Shopify 側の設定は基本的に「組織用のSAML認証」の内容に従います。

ドメイン認証

Shopify で SSO を行うためには利用する email のドメインの認証が必要です。

ドメインの認証 に従い、TXT レコードを利用中の DNS で利用するドメインに対して設定します。

https://shopify.plus/YOUR_DOMAIN/users/security (YOUR_DOMAINは自身のドメイン) 内で、 Domain verification のセクションから Verification Code は取得できます。

Shopify の SSO URL & SP Entity ID の取得

ドメイン認証が完了したら SSO 設定を行う準備はできています。組織用のSAML認証の「設定を手動で行う」セクションに従い下記の URL を取得します。
これらの URL は後ほど Google 側で利用します。

2. Google 側の SSO 設定

1.カスタム SAML アプリの作成

Google 側の設定は基本的に「カスタム SAML アプリを設定する」の内容に従います。
弊社でも利用している Atlassian や Salesforce の場合は Google 側で専用の SAML アプリを用意しているのですが、2022年3月時点では Shopify 用のものはないのでカスタムアプリを作成することになります。

2. Service Provider の設定

カスタムアプリの名前を Shopify SSO のように設定し、次に出てくるメタデータのページではまだ何もせずその次に進みます。

次に Service provider の設定ページになるので、Shopify の管理画面で得られるURL を下記のマッピングで入力します。

  • ACS URL: Shopify の Single sign-on URL
  • Entity ID: Shopify の SP Entity ID (固定値)

次に、`Service provider details` ページ内下記に有る Name ID の設定です。

  • Name ID format: PERSISTENT
  • Name ID: BasicInformation > Primary email

と設定します。終わると以下のスクリーンショットの形になります。

3. SAML attribute mapping

最後に、SAML の属性のマッピングを行います。

Shopify 側の指示にあるように、以下のように属性のマッピングを行います。

  • Primary email -> email
  • First name -> first_name
  • Last name -> last_name

結果は以下のスクリーンショットの形になります。

4. SAML の有効可

Google 側の設定は完了したので、「SAML アプリを有効にする」に従い GWS 組織内のメンバーに対して SAML アプリを有効化します。

Shopify で Google の SAML 設定情報の登録

Shopify の ユーザーセキュリティの SAML configuration セクションには ENTER YOUR IDENTITY PROVIDER METADATA URL という入力フォームがあります。

Google では IdP として SSO URLEntity ID の 2つの URL が提供されているのに一体何の URL が必要なのかと戸惑うかもしれません。
ここでは、Google の SAML のメタデータの XML を Shopify に提供する URL を入力する必要があります。

  1. Google の SSO metadata の ダウンロード

Google の Admin 画面で先ほど作成した SAML のアプリには DOWNLOAD METADATA のボタンがあります。こちらをクリックすることでメタデータのファイルがダウンロードできます。

2. メタデータの公開

手元にあるメタデータを Shopify 側から見えるようにする必要があります。簡単に行うなら GCP の GCS や AWS の S3 に置く方法が良いと思います。
弊社では GCP を利用しているので GCS に XML を置いて公開しました。

GCS の Bucket を作成したら XML ファイルをアップロードし、公開用の権限を付与します。こちらが参考になります。

ここで実際に XML を GCS にアップロードする前に下記にあるように XML の内容を確認してください。

私が行ったときは下記のように XML 内のNameIDFormatの内容を変更する必要がありました。

XML をダウンロードした時点で、NameIDFormat は下記の形でした。

<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>

事前に Name ID format をPERSISTENT で設定したはずなのに emailAddress となっています。

そこで、設定を Shopify の要求と合わせるために下記のように書き換えました。

<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>

この値の設定・確認後に XML ファイルを GCS にアップロードします。

3. XML の URL を Shopify へ登録

GCS へ 登録した XML を GCP のコンソール上でクリックすると Public URL が見つかります。下記の形式になります。

https://storage.googleapis.com/PROJECT_NAME/OBJECT_NAME

この URL をコピーし Shopify の SAML メタデータ URL の入力欄に登録すると、Shopify がメタデータを読み取り SSO が設定可能になります。

Shopify の SSO の有効可

ここまで来たらあとは Shopify の手順書に従って設定を行えば大丈夫です。
具体的には

  1. SSO を一部のユーザーに有効化し、設定ができているか確認する
  2. ドメイン全体に SSO を設定する

テストに関しては、Google の SAML アプリからも実行可能ですが、Shopify でログアウトした状態から Shopify 起点でも行ったほうが良いです。

注意する点としては下記の点です。どんなバグを踏むかわからないので、必ず問題発生時に対応できるために用意しましょう。
SSO 周りで問題が起きると Shopify にログインできなくなります。管理者アカウントで問題が起きると設定の変更もできなくなるので気をつけてください。

  1. 自身のドメイン外の email アドレスで、Shopify Plus のユーザー管理権限を持つアカウントを用意する
  2. 必ず一部のユーザーからテストし問題が起きても影響の少ないアカウントを用いる

Google を IdP とした Shopify の SAML を用いた SSO 設定方法は以上となります。お疲れさまでした。

Google を IdP とした Shopify の SAML を用いた SSO 設定を行うまでに起きた問題

上記では SSO の具体的な設定方法を説明しました。以下では実際に設定が完了できるまでに直面した問題について紹介します。

IDENTITY PROVIDER METADATA URL って何?

私はこれまでに Salesforce や Atlassian などで何度か SSO を設定してしていましたが、これらのサービスの場合は 専用の SAML アプリもあり、特に詰まること無く設定できていました。
経験上は SP が ACS URL と Entity ID を提供し Google 側に登録、Google は IdP として SSO URL と Entity ID を提供し SP 側に登録すればよく、公式ドキュメントに従えば設定可能です。

ところが Shopify は METADATA URL という 1つの URL 入力欄しか設けていません。Google から提供されている、SSO URL・ Entity ID 両方試しましたがエラーが返り、しばらく調べても答えは出なかったため Shopify Plus のサポートに問い合わせました。

サポートはとても親切に対応してくれましたがチャットでは答えは出ず、 email に移行しました。
email で Google 側の公式ドキュメントなどを案内してくれました。既に読んでいることを伝え、裏側で見えるログなどはないかと聞いたら返事はもらえませんでしたが、ここで諦めるわけにはいきません…!

Google を IdP とした SSO のパターンを調べた方が良いと思い、統合対応 SAML アプリの一覧を順に確認し始めました。
たまたま 7Geese の設定を開いたら 「Google IdP メタデータを公開ファイル サーバーにホストする」という欄があり、メタデータの共有で詰まっていたのでここで直感が働きました。「SSO URL と Entity ID は必ず必要なはずだが URL 入力欄は1つしか無い。もしかして XML でまとめて受け取ろうとしている…?」
ここで、DL した メタデータの XML を GCS にアップロードし、Shopify に URL を登録した所、なんとエラー無しで通りました。感動しました。

Google から SAML App テストは通るけど Shopify 起点での SSO はエラーが返るのは何故?

Shopify 内でメタデータ URL が登録可能になったのでテスト用アカウントの SSO 設定を有効化し、テストを開始しました。
まず Google 側の SAML アプリからテストを行ったところ成功しました。次に、期待を胸に Shopify 起点で SSO を開始すると以下のようなエラーが返ってきてしまいました。

There was a problem logging in with SAML SSO. Contact your administrator and have them the SAML configuration.

私が Admin だよ:) と思いつつもどうしようもないので再び Shopify サポートに連絡したところ、今回はサポートからTechnical Team へエスカレーションしてくれました。おそらく未知の問題にも対応する技術的スキルの強いチームだと思われます。

期待を胸に返信を待っていると、Technical Team からの連絡はすぐに来ましたが、内容は「SSO でログインするには IdP である Google にログインしてね」という返事でした。
エラーは Google にログイン後 Shopify にリダイレクト時にエラーを受け取っており、また以下のような文面もあり、今後の行方にかなり不安を覚えました。

Support brought me up to speed on the issue you are having with SAML login through Shopify but this is expected behaviour.

このメッセージで不安になるポイントはexpected behavior だと説明していることです。私自身もテクニカルサポートの経験がありますが、この言葉を使うときは「システム的には問題はなく、ユーザー自身の行動が問題だ」という認識である可能性が高いです。
これはまずいと思いつつ、これまでの自身の試みを説明したら状況を理解してもらえ、更なる調査が始まりました。

これが長い旅の始まりで、本社(カナダ)の社員なのかアメリカ大陸の日中、つまり日本時間の深夜に返信が送られ、朝一で私が相手からの提案を試してフィードバックを送るという1日1通の文通が(毎日ではないですが)始まりました。

調査の過程の中で、挙動のスクリーンショット撮影や、動画撮影、Shopify 側設定の削除 & 再設定、Google 側設定の削除 & 再設定、などを含めた様々な試みが行われ、私自身もドキュメントを何度も確認しましたがなかなか問題は解決しません。
Google 起点だと SSO は成功するのに Shopify 起点だと失敗するのでこれは Shopify 内の問題ではないか、とにかく Shopify 内部での Log を見てエラーが何に起因するものなのか確認して欲しいと懇願し続けました。

しばらくしたら内部の Log も確認してもらえ、SAML の user claim が email になっていることがわかりました。
PERSISTENT にするべきだという話になりましたが、私はドキュメントにある通り PERSISTENT で最初から設定しています。
また、Google 側では入力欄の制約上 Name ID format: PERSISTENT 、Name ID: BasicInformation > Primary email の双方を設定する以外の表現は不可能です。

もしかして BasicInformationが期待しない影響を与えており、 Google を IdP とした Shopify の SSO は不可能なんじゃないかと疑い始めましたが、Shopify の Technical Team がついに問題を見つけました。
問題は先述の設定方法で触れたメタデータ XML の内容で、 NameIDFormatformat:persistent ではなく、format:emailAddress となっていたのです。これは「user claim が email になっている」という情報とも一致します。

Google の SAML 用メタデータ XML は Admin コンソールからダウンロード出来るのですが、実はカスタム SAML アプリ で Name ID format を設定する前の段階でもダウンロード可能です。そのため、個別のアプリでの設定は反映されないようで、アプリ作成&起動後にもう一度ダウンロードしても、アプリ内での設定は XML 側には反映されておらず、format:emailAddress のままでした。

このポイントの対応後、メタデータ XML を再アップデートすると SSO は期待通りに動くようになりました。
ここにたどり着くまで SSO 開始後からほぼひと月が経過しており、最近経験した課題の中で最も難しいものでした。

おわりに

ドキュメントには直接的には書いていないですが、Google を IdP とした Shopify との SSO 連携は可能です。
2022年3月時点の公式ドキュメントによると Okta、OneLogin、Azure は IdP 側で Shopify 用の SSO アプリが有るようです。Google はアプリが用意されていないですが、Google Workspace は連携できないとは考えず本記事の内容を試していただけたらと思います。

最後に、Shopify の Technical Team の方は本当に粘り強く調査を進めてくれて感謝しています。自身もクラウドサポートの経験は有るので色々と想像できますが、難しい状況下で諦めない姿勢が素晴らしいです。

エンジニアリングチームについて

今回の話は Belong エンジニアリングチームの全体の関わる話ではないですが、弊社は継続的にエンジニアを募集しています。
認証・認可関係に詳しい、難しい課題に取り組みたい、諦めない強い心を持っているなど色々なエンジニアに Belong に興味を持っていただけたら幸いです。

エンジニアリングチームの紹介:

--

--

tty
Belong blog

CTO at Belong Inc. Software engineer interested in server side apps and cloud architecture. (Twitter:ttyfky)