シングルサインオンAPI

  シングルサインオンAPI

シングルサインオンAPI利用の前提条件について

シングルサインオンAPIの利用には、makeshop APIの利用前提に加えて以下のRFCへの理解が求められます。

APIの活用には高度な技術や専門的な知識が必要となりますので、本ドキュメントを一読の上利用ご検討をお願いいたします。

動作概要

当APIを利用することで、外部サイトでmakeshopの認証機構を利用することができます。
外部サイトとmakeshopでシングルサインオンします。

機能概要

API群でシングルサインオン機能を提供します。

  1. ユーザー認証API(ログイン要求)
    外部サイトでログインが必要な場合、指定URLへクライアントID・リダイレクト先URLと共にmakeshopへログイン要求を行います。
    makeshop上のログイン画面でログインが完了した場合、認可コードと共にリダイレクト先へ遷移します。
    この時点でmakeshop上ではログインが完了しています。
  2. アクセストークン発行API
    認可コードによってアクセストークンおよびIDトークンを取得します。
    ※クライアントにて各トークンの検証処理を行っていただく必要があります。
  3. 会員ID取得API
    取得したアクセストークンで会員情報にアクセスし、ログイン中の会員IDを取得します。
  4. ログアウト連携API
    取得したアクセストークンで会員情報にアクセスし、ログイン中の会員IDを取得します。

備考

ログアウトに関する動作

  • アクセストークンの有効期限が切れている場合はNGを返す。必要であれば、外部サイト側で再ログインを要求する

makeshopでログアウトする条件

  • 明示的にログアウトの操作をした場合
  • ブラウザを終了した場合
  • ログインから30日間放置した場合

動作イメージ(makeshopに未ログインのとき)

makeshopに未ログイン

動作イメージ(MakeShopにログイン済みのとき)

makeshopにログイン済み

動作イメージ(ログアウト連携)

ログアウト連携

ご利用前の準備

シングルサインオンAPIを利用するには、ショップ管理画面でシングルサインオンの利用設定を行ってください。

シングルサインオン設定


シングルサインオンを利用する外部サイトを登録・修正します。

外部サイトを登録・修正


外部サイトを登録・修正


外部サイトを登録・修正

ログイン画面の動作制限(PC/スマホ共通)

  • PC・スマホは接続元の端末を判別してそれぞれのログイン画面へ自動振り分けられます。
  • 複数ショップ連携を利用している場合、ログインが成功している場合はどのショップでもログイン状態となります。
  • GoogleAnalyticsの計測には対応していません。
    GoogleAnalyticsの計測に対応致しました。(2020年5月28日更新)
  • ※PHPセッションを利用する際の注意事項
    makeshopではセッション管理に「PHPSESSID」を使用しています。
    WordPressなどmakeshop外のサービス、サイトで同名称のCookieを使用すると、
    ログインや購入手続きなどでにエラーとなる可能性があります。

  • 「PHPSESSID」以外の名称を利用する
  • 「PHPSESSID」をそのまま用いる場合はドメインが変わってもcookie情報が引き継がれるよう
  •  HttpOnly属性、Secure属性、SmaeSite属性(none)を指定する

    など対応をお願いします。

API仕様

注意事項

  • 文字コード
    UTF-8をご利用ください。
  • APIリクエスト先URL
    APIのリクエストは、全て管理画面の収容サーバーへ行います。管理画面へログイン後にURLをご確認ください。

APIリクエスト先URL

ユーザー認証API

ユーザーがログインID、クライアントが認可コードを取得するAPIです。

リクエストURL

https://管理画面のドメイン/api/openid/login/

SNIにご対応ください。

リクエストパラメータ

No パラメータ名 必須 説明
1 response_type API種別。code固定。
2 client_id クライアントID。管理画面で登録するショップ/外部サイト単位のID。
3 redirect_uri レスポンスが返されるリダイレクト先URL。管理画面で事前登録される情報。URIはクエリーコンポーネントを含んでもよいが、フラグメントコンポーネントは含んではいけない。要件次第では、複数登録可能とする。URLエンコードが必要。
4 scope makeshopのリソースにアクセスする範囲を指定する。openid固定。
5 state CSRF攻撃対策として、リクエストとコールバック間のセッションを検証するための文字列。リクエストとコールバックの間で維持されるランダムな値。リダイレクトによってクライアントに処理を戻す際にこの値を付与する。利用例として、クライアント側でブラウザCookieと紐づいた暗号化されたセキュアな値を指定する。
6 nonce クライアントセッションとIDトークンを紐づける文字列であり、リプレイアタック対策のパラメーターとなる。IDトークンに含まれて返却される。リクエストごとにランダムな文字列を指定する事。
  • ※パラメータはPOSTでURLエンコードした値を送信してください。

レスポンス

管理画面で設定したリダイレクト先URLにパラメータを付与してリダイレクトします。

No パラメータ名 必須 説明
1 code 認可コード。有効期限は10分。クライアントIDとリダイレクト先URL、API実行ごとに発行する一意のコード。
2 state クライアントからのリクエストに含まれていた場合は、必須。クライアントから受け取った値をそのまま返す。
一致しない場合にはCSRF攻撃の可能性があるため、アクセストークン発行APIを実行しないようにしてください。

サンプルレスポンス

https://example.jp/auth/mypage/?code=xxxxxxxxxxxxxxxxxxxxxx&state=aaaaaaaaaaaaaa
  • ※レスポンスの文字コードはUTF-8です

クライアント検証

クライアント(外部アプリケーション)は以下に従ってレスポンスを検証する。(フェーズ1の仕様から変更なし)

  • クライアントは2回以上認可コードを使用してはならない。
  • クライアントは認識できないレスポンスパラメーターを無視する。
  • リクエストパラメータ「state」を設定した場合、レスポンス値と同一である事を確認する。
    ※リクエスト前のパラメータ「state」値は保存しておく必要がある。

アクセストークン発行API

クライアントがアクセストークンおよびIDトークンを取得するためのAPIです。

リクエストURL

https://管理画面のドメイン/api/openid/access_token.html

リクエストパラメータ

No パラメータ名 必須 説明
1 grant_type API種別。authorization_code固定。
2 client_id クライアントID。管理画面で登録するショップ/外部サイト単位のID。
3 client_secret クライアントパスワード。管理画面で登録するショップ/外部サイト単位のパスワード。
4 code 認可コード。有効期限は10分。API実行ごとに発行する一意のコード。
管理画面で設定した戻り先URLに戻りパラメータ付与してリダイレクトする。
5 redirect_uri レスポンスが返されるリダイレクト先URL。管理画面で事前登録される情報。
URIはクエリーコンポーネントを含んでもよいが、フラグメントコンポーネントは含んではいけない。
  • ※パラメータはPOSTでURLエンコードした値を送信してください。

レスポンス

レスポンスはJSON形式で返却されます。

No パラメータ名 必須 説明
1 access_token アクセストークン文字列。makeshopリソースへアクセスするのに使用。
2 token_type アクセストークンタイプ。Bearer固定。
3 expires_in アクセストークンが失効するまでの秒数3600固定。有効期限は1時間。
4 scope クライアント(外部アプリケーション)に取得するスコープを明示する。openid以外許可していないので、openidを出力する。
5 id_token 会員認証イベントに関する情報をJWT形式で返却する。エンドユーザ、外部アプリケーション、認証サーバの情報を含み、相互で検証を可能にする。

サンプルレスポンス

{
    "access_token" : "aaaaaaaaaaaaaaaaa",
    "token_type" : "Bearer",    //固定値
    "expires_in" : 3600,        //固定値
    "scope" : "login_info"      //固定値   
    "id_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvZGV2Lm1ha2VzaG9wLmpwIiwic3ViIjoiMTEwMTAyNTcxODU5MDA4NjIxODEzIiwiYXVkIjoidGVlMmxoNW43NXp2a2pvaDV0ajYybXNoNG84d2I4OThxZ3V2NHd2eCIsImV4cCI6MTQyMTgyMDUzMiwiaWF0IjoxNDIxODE2OTMyLCJhdXRoX3RpbWUiOjE0MjE4MTY1MTIsIm5vbmNlIjoiclJoTUI5SXJGYm82eEhCYThvbjRSeSIsImF0X2hhc2giOiJ4YjBPUEh0aVRRR195MVlzQ0YwLVVnIn0.FkNTxT59BCUqwkXgYcSF1HCyaHc1u7zbR-coIyMDSSo"
}
  • ※レスポンスの文字コードはUTF-8です

IDトークン概要

IDトークン構造図

IDトークンは以下のデータ構造として表現される。

データ構造

※参照:JSON Web Token (JWT)

IDトークン生成方法

HMAC-SHA256アルゴリズムで署名する。以下の手順で署名し、JWTを生成する。

  1. JSON形式のヘッダ部、ペイロード部をそれぞれBase64URLエンコードする。
  2. 1のヘッダ部、ペイロード部を.で連結し、こちらをメッセージ文字列とする。
  3. client_secretを共通鍵として、メッセージ文字列をアルゴリズムHMAC-SHA256によってシグネチャー生成する。
  4. 3で生成したシグネチャーをBase64URLエンコードする。
  5. 2で生成したメッセージ文字列と4のシグネチャーを.で連結し、JWTとする。

IDトークン ヘッダ部

No パラメータ名 必須 説明
1 typ オブジェクトの形式を示す。JWT固定。
2 alg JWSの署名に使われる暗号アルゴリズムを示す。HS256固定。
※HS256はHMAC-Sha256の略(JWAにて定義)
ハッシュアルゴリズムはSha256です。

IDトークン ペイロード部(クレーム・セット)

No パラメータ名 必須 説明
1 iss レスポンスの発行者。https://管理画面のドメインが記載されます。
2 sub IDトークン発行毎に発行される、ユニークで再利用されることのないエンドユーザのSubject識別子。
3 aud クライアントIDを指定する。
4 exp IDトークンの有効期限。UNIXタイムスタンプ形式。IDトークンが発行時刻から1時間。
5 iat IDトークンが発行された時刻。UNIXタイムスタンプ形式。
6 nonce IDトークンとクライアントセッションを関連づけるため、リプレイアタックの軽減に使用さるランダムな文字列。ユーザ認証APIリクエスト時に送信する値と同値が返却される。
7 at_hash access_tokenのハッシュ値。access_tokenのASCII バイト列のハッシュ値の左半分(16バイト)をBasd64URLエンコードしたもの。

IDトークン サンプル

メッセージ(ヘッダー:JSON)

{"typ":"JWT","alg":"HS256"}

メッセージ(クレーム・セット:JSON)

  {
    "iss":"https:\/\/dev.makeshop.jp",
    "sub":"110102571859008621813",
    "aud":"tee2lh5n75zvkjoh5tj62msh4o8wb898qguv4wvx",
    "exp":1421820532,
    "iat":1421816932,
    "auth_time":1421816512,
    "nonce":"rRhMB9IrFbo6xHBa8on4Ry",
    "at_hash":"xb0OPHtiTQG_y1YsCF0-Ug"
  }

メッセージ(ヘッダーおよびクレーム・セットをBase64URLエンコード、.連結後)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJodHRwczpcL1wvZGV2Lm1ha2VzaG9wLmpwIiwic3ViIjoiMTEwMTAyNTcxODU5MDA4NjIxODEzIiwiYXVkIjoidGVlMmxoNW43NXp2a2pvaDV0ajYybXNoNG84d2I4OThxZ3V2NHd2eCIsImV4cCI6MTQyMTgyMDUzMiwiaWF0IjoxNDIxODE2OTMyLCJhdXRoX3RpbWUiOjE0MjE4MTY1MTIsIm5vbmNlIjoiclJoTUI5SXJGYm82eEhCYThvbjRSeSIsImF0X2hhc2giOiJ4YjBPUEh0aVRRR195MVlzQ0YwLVVnIn0

メッセージをHMAC-SHA256でシグネチャー生成(結果をBase64URLエンコード)

FkNTxT59BCUqwkXgYcSF1HCyaHc1u7zbR-coIyMDSSo
  • ※client_secret=x5k6osnhze6tnz5zonhcdswzcjjjo4pwltswv43uを共通鍵とする。

IDトークン(メッセージとシグネチャー生成を.連結)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJodHRwczpcL1wvZGV2Lm1ha2VzaG9wLmpwIiwic3ViIjoiMTEwMTAyNTcxODU5MDA4NjIxODEzIiwiYXVkIjoidGVlMmxoNW43NXp2a2pvaDV0ajYybXNoNG84d2I4OThxZ3V2NHd2eCIsImV4cCI6MTQyMTgyMDUzMiwiaWF0IjoxNDIxODE2OTMyLCJhdXRoX3RpbWUiOjE0MjE4MTY1MTIsIm5vbmNlIjoiclJoTUI5SXJGYm82eEhCYThvbjRSeSIsImF0X2hhc2giOiJ4YjBPUEh0aVRRR195MVlzQ0YwLVVnIn0
.
FkNTxT59BCUqwkXgYcSF1HCyaHc1u7zbR-coIyMDSSo

クライアント検証

クライアント(外部アプリケーション)は以下に従ってレスポンスを検証する。

  • IDトークンを検証する。
  1. 暗号化されたIDトークンを、以下の手順で署名チェックし、複合化する。
    • JWTのヘッダ部とペイロード部とシグネチャー部の3つを.(ドット)で分割する。
    • 各値をBase64URLデコードする。
    • ヘッダー部のtypパラメータがJWT、algがHS256となっている事を確認する。
    • client_secretを共通鍵として、メッセージ文字列をアルゴリズムHMAC-SHA256によってシグネチャー生成する。
      ※メッセージ文字列:ヘッダー部とペイロード部を.(ドット)で連結した値(Base64URLデコード前の文字列)
    • 上記生成した値とシグネチャー部が一致することを確認する。
  2. ペイロード部issがhttps://管理画面のドメインと同一である事を確認する。
    例)shop1の場合:https://shop1.makeshop.jp
  3. ペイロード部audがclient_idと同一である事を確認する。
  4. ペイロード部expが現在時刻のタイムスタンプより前である事を確認する。
  5. ペイロード部iatが発行後10分以内(現在時刻のタイムスタンプ値 マイナス600秒)にレスポンスがあった事を確認する。
    ※ユーザ認証APIリクエストから10分以内(認可コードの有効期限内)にアクセスした事を確認する。
  6. ペイロード部nonce値がユーザ認証APIリクエスト時に送信したnonce値と同一であることを確認する。
    • nonce値が、保存してあるnonceと同一である事を確認する。
    • リプレイアタックを防止するため、確認済のnonce値は破棄する。
      ※リクエスト前のnonce値はクライアント(外部アプリケーション)側のデータベース等に保存して管理する必要がある。
  • アクセストークンを検証する。
  1. レスポンスのaccess_tokenをハッシュアルゴリズムSHA-256(IDトークンのヘッダ中のalgパラメータで指定)にて、ASCIIバイト列(バイナリデータ)にハッシュ化する。
  2. ハッシュの左半分(16バイト)を取り出し、それをBase64URLエンコードする。
  3. IDトークンのペイロード部のat_hashクレームの値が生成された値と同一である事を確認する。at_hashについて詳しくは:3.2.2.10. ID Token

会員ID取得API

クライアントが会員IDを取得するためのAPIです。

リクエストURL

https://管理画面のドメイン/api/openid/user_login_info.html

リクエストパラメータ

No パラメータ名 必須 説明
1 access_token アクセストークン文字列。makeshopリソースへアクセスするのに使用。
  • ※パラメータはPOSTでURLエンコードした値を送信してください。

レスポンスパラメータ

レスポンスはJSON形式で返却されます。

No パラメータ名 必須 説明
1 sub IDトークン発行毎に発行される、ユニークで再利用されることのないエンドユーザの識別子。
2 member_id ログインした会員ID。

サンプルレスポンス

{
    "sub": "110102571859008621813",
    "member_id" : "1323213521"
}
  • ※レスポンスの文字コードはUTF-8です
  • ※メールアドレスでログインした場合でも、makeshopに登録された会員IDを返却します。

クライアント検証

クライアント(外部アプリケーション)は以下に従ってレスポンスを検証する。

  • IDトークンで取得したsubクレームが、当レスポンスのsubと同一である事を確認する。

ログアウト連携API

サイト間でログアウト連携するためのAPIです。

リクエストURL

https://管理画面のドメイン/api/openid/logout/

リクエストパラメータ

No パラメータ名 必須 説明
1 id_token_hint 以前発行したIDトークン。
2 post_logout_redirect_uri レスポンスが返されるリダイレクトエンドポイント。管理画面で事前登録される情報。URIはクエリーコンポーネントを含んでもよいが、フラグメントコンポーネントは含んではいけない。※認証時のリダイレクトエンドポイントとは別URLとする。
3 state CSRF攻撃対策として、セッションを検証するためのランダムな文字列。当APIのリクエストとレスポンス間で維持する。リダイレクトによってRPに処理を戻す際にこの値を付与する。
  • ※パラメータはPOSTでURLエンコードした値を送信してください。
  • ※バリデーション方法
  1. IDトークンのclient_id(=audクレーム)にてクライアントを認証する。
  2. パラメータpost_logout_redirect_uriの値の検証、およびクライアントにて事前登録されているかどうか確認する。

レスポンスパラメータ

No パラメータ名 必須 説明
1 state CSRF攻撃対策として、セッションを検証するためのランダムな文字列。当APIのリクエストとレスポンス間で維持する。リダイレクトによってRPに処理を戻す際にこの値を付与する。

レスポンス方法

  • ログアウトが正常の場合(=成功レスポンス)
    • リクエストで指定したリダイレクトエンドポイントpost_logout_redirect_uriへ、レスポンスパラメータをURLクエリパラメータとして付与してリダイレクトする。
  • ログアウトでエラーの場合
    • HTTP 404エラーとする。

クライアント検証

クライアント(外部アプリケーション)は以下に従ってレスポンスを検証する。

  • クライアント(外部アプリケーション)は以下に従ってレスポンスを検証する。
  • クライアントは認識できないレスポンスパラメーターを無視する。
  • リクエストパラメータstateを設定した場合、レスポンス値と同一である事を確認する。
  • ※リクエスト前のパラメータstate値は保存しておく必要がある。

エラーレスポンス

エラーが発生した場合は、APIによってレスポンスの内容が異なります。

No パラメータ名 必須 説明
1 state 以下のいずれかのエラーコードを返却する。
invalid_request リクエストに必要なパラメーターが含まれていない。
access_denied 不正なパラメータのためリクエストが拒否された、認可コードが2回以上使用された。
unsupported_response_type レスポンスタイプがサポートされていない。
invalid_scope 要求されたスコープが不正である。
server_error リクエストの処理ができないような予期しない状況に遭遇した。
invalid_client クライアント認証に失敗した。
invalid_grant 認可コード、アクセストークンが不正である。
unsupported_grant_type grant_typeが不正である。

エラーレスポンスの返却先・形式

【ユーザー認証API】 404エラー

【アクセストークン発行API/会員ID取得API】 呼び出し元にJSON形式で返す

サンプルレスポンス(JSON形式の場合)

{
    "error_code" : "invalid_request"
}
  • ※レスポンスの文字コードはUTF-8です

シングルサインオン仕様説明書Ver.2.2.0.pdf