Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web API仕様 #4447

Open
kiy0taka opened this issue Jan 22, 2020 · 19 comments
Open

Web API仕様 #4447

kiy0taka opened this issue Jan 22, 2020 · 19 comments
Labels
affected:外部仕様 外部仕様の変更や追加 enhancement 機能追加 Status: discussion
Milestone

Comments

@kiy0taka
Copy link
Contributor

kiy0taka commented Jan 22, 2020

概要(Overview)

外部サービスと連携するためWeb API機能検討する。
プラグインではなく、本体の機能として組み込みたい。

API仕様

GraphQL によるWeb APIを提供する。
GraphQLの仕様に従ってQueryとMutationについて考える。

Query

データを取得するためのQueryとしては、管理画面にある以下の一覧を提供する。

  • 商品一覧
  • 受注一覧
  • 会員一覧

それぞれの一覧はクライアントのクエリに対して、Entityの関連に基づいたデータを返す。

例えば、商品一覧において、商品ID/ステータス/商品規格のコード/販売価格を要求するには以下のようなクエリを実行する。

{
  products {
    id
    name
    ProductClasses {
      id
      code
      price02
      stock
    }
    Status {
      id
      name
    }
  }
}

この場合、EC-CUBEは以下のようなレスポンスを返す。

{
  "data": {
    "products": [
      {
        "id": "1",
        "name": "彩のジェラートCUBE",
        "ProductClasses": [
          {
            "id": "1",
            "code": "cube-01",
            "price02": 110000,
            "stock": null
          },
          {
            "id": "2",
            "code": "cube-01",
            "price02": 110000,
            "stock": null
          }
        ],
        "Status": {
          "id": "1",
          "name": "公開"
        }
      },
      {
        "id": "2",
        "name": "チェリーアイスサンド",
        "ProductClasses": [
          {
            "id": "11",
            "code": "sand-01",
            "price02": 2800,
            "stock": 100
          }
        ],
        "Status": {
          "id": "1",
          "name": "公開"
        }
      }
    ]
  }
}

プラグインなどによるカスタマイズでQueryを追加できる仕組みも提供する。

Mutation

データの変更を行うMutationについては、ビジネスロジックに基づいたユースケースを決定し提供する。
ユースケースについては要検討。

プラグインなどによるカスタマイズでMutationを追加できる仕組みも提供する。

認可

Web APIの認可方法として OAuth 2.0 を提供する。

Webhooks

EC-CUBEのデータ変更をリアルタイムに他システムへ通知するための仕組みとしてWebhookを提供する。
GraphQLで提供するQueryに合わせて以下の情報が変更された場合に通知する。

  • 商品情報
  • 受注情報
  • 会員情報
@kiy0taka
Copy link
Contributor Author

kiy0taka commented Jan 22, 2020

商品/受注/会員のQueryを実装してみました。
https://github.com/kiy0taka/ec-cube/tree/experimental/graphql

@okazy
Copy link
Contributor

okazy commented Jan 23, 2020

3系Issueはこちら
#1530

@okazy okazy added affected:外部仕様 外部仕様の変更や追加 enhancement 機能追加 Status: discussion labels Jan 23, 2020
@okazy okazy added this to the 4.0.x milestone Jan 23, 2020
@nanasess
Copy link
Contributor

Web APIの認証方法として OAuth 2.0 を提供する。

細かいところですが、 OAuth2.0 では認可のためのフレームワークですので、認証であれば Open ID Connect になると思います。

@okazy
Copy link
Contributor

okazy commented Jan 29, 2020

更新できていないので折りたたみます。

進捗

ニュース

主要な機能の正常系の実装が完了
https://github.com/okazy/ec-cube/tree/experimental/oauth2

基本的な設計指針

マイルストーン

  • 2月末 ベータ版
    • 取得
    • 認証
  • 春 正式リリース(4.0.x)
    • 更新
    • Webhooks

ベータ版までの進捗

  • 実装

  • テスト・レビュー

  • ベータ版リリース

  • 取得(Query)

    • API Platformの検証
    • webonyx/graphql-phpの導入
    • 取得可能データ
      • 商品一覧
      • 受注一覧
      • 会員一覧
    • API定義は、Entityの定義に依存する
    • DBの動作確認
      • PostgreSQL
      • MySQL
      • SQLite
  • 認証・認可(OAuth 2.0 + Open ID Connect)

    • oauth2-bundleの組み込み
      • authorizeエンドポイント(MUST)
        • 認証開始時にアクセスするエンドポイント。 oauth2-bundle の導入で作成される。
      • tokenエンドポイント(MUST)
        • アクセストークン取得時にアクセスするエンドポイント。 oauth2-bundle の導入で作成される。
      • tokenInfoエンドポイント
        • oauth2-bundle では初期で未実装。ベータ版には入らない。
      • UserInfoエンドポイント
        • oauth2-bundle では初期で未実装。ベータ版には入らない。
    • OAuth2.0
    • 認証の状態によるAPIの接続制御
    • CSRF対策(state パラメータ?)
    • ブラウザでのUI
  • 実装したこと、まだできないことの明確化(issue化?)

  • βのスコープ外

    • 更新(Mutation)
    • プラグインでの拡張
    • Webhooks
      • 以下の情報が更新されたタイミングでPOST
        • 商品情報
        • 受注情報
        • 会員情報
      • Webhooksは管理画面から登録可能
      • POST内容の仕様検討(基本的には更新の通知が目的のため何も送信しない想定)
      • タイムアウトなどの仕様検討

ベータ版の想定形式

  • branchを作って開発を行う
  • GitHub内でtagを打ってリリースする

正式リリースの想定形式

ベータ版リリース後の反応を見て変更になる可能性あり

  • 本体のマスターbranchに取り込む
  • GitHub内でtagを打ってリリースする
  • パッケージングしてリリース(4.0.4?)

TODO

  • indexの設定
  • Entity拡張への対応
  • oauth2-bundleの要件でPHP7.2以上となる(EC-CUBE4は7.1.3以上)
  • oauth2-bundleとEC-CUBEのルールの吸収
  • 実装をServiceにまとめて拡張性をあげる
  • webhooksのプラグインでの登録機構
  • /authorizeのアクセス制限

@tao-s
Copy link
Contributor

tao-s commented Feb 6, 2020

src/Eccube/GraphQLじゃなくて、API周りはServiceにまとめた方が良く無いですか?
ApiController->GraphQLApiService->xxxService な感じで

ApiServiceにはApiInterfaceとか作って、RESTとかでも同じの使う感じにして

@okazy
Copy link
Contributor

okazy commented Feb 7, 2020

そうですね、特に認証周りは汎用性あると思うので、プラグインなどでも利用できるような機構にしたいと思っています。

@pineray
Copy link
Contributor

pineray commented Feb 9, 2020

webhook をプラグインから登録できるようになると楽しいです。
レポジトリを直接さわるのではなく、サービスとか設定ファイル経由で。

@okazy
Copy link
Contributor

okazy commented Feb 19, 2020

API開発用のブランチを切りました。
ブランチ名: experimental/api
https://github.com/EC-CUBE/ec-cube/tree/experimental/api

@okazy
Copy link
Contributor

okazy commented Feb 19, 2020

experimental/apiブランチにGraphQLとOAuth2.0の実装のプルリクを出しました。
#4474
ぜひご意見や感想などをください。

@okazy
Copy link
Contributor

okazy commented Apr 9, 2020

API開発状況まとめ

以下は暫定のものとなり、随時更新をしていきます。

リリーススケジュール

  • 更新系の実装: 6月下旬
  • 外部仕様凍結: 未定
  • リリース: 未定

2020/5/28 更新

APIの仕様

  • 4.0.x系のプラグインとしてリリース
  • OAuth2.0
    • Grant Type: Authorization Code
    • Scope: read,write
  • GraphQL
    • Query
      • Web API仕様 #4447 (comment)
      • 取得できるデータ: 商品一覧、受注一覧、会員一覧
      • それぞれの一覧画面で指定できる検索条件で絞ることが可能
      • [残課題] 日付の取得、ページング、出荷時間による検索
    • Mutation
      • 商品規格情報の在庫数を更新
      • 注文出荷情報のステータスを更新

GraphQL Mutationの仕様(案)

  • 商品規格情報の在庫数を更新

パラメータ

Name type Description
id ID 商品規格ID (必須)
stock Int 商品規格の在庫数 (在庫無制限が無効の場合は必須)
stock_unlimited Boolean 商品規格の在庫無制限 (必須)

実行例

# 在庫無制限ではない商品
mutation {
    editProductStock (
        id: 1
        stock: 5
        stock_unlimited: false
    ) {
        id
        stock
        stock_unlimited
    }
}
# 在庫無制限の商品
mutation {
    editProductStock (
        id: 1
        stock_unlimited: true
    ) {
        id
        stock
        stock_unlimited
    }
}
  • 注文出荷情報のステータスを更新

パラメータ

Name type Description
id ID 出荷ID (必須)
shipping_delivery_name String 配送方法 (変更する場合は必須)
shipping_date String 出荷日 (変更する場合は必須)
tracking_number String お問い合わせ番号 (変更する場合は必須)
note String 出荷用メモ欄 (変更する場合は必須)

※注文情報に紐づく全ての出荷情報に出荷日が入れば、その注文情報が出荷済みとなる。

実行例

mutation {
    editShippingStatus (
        id: 1
        shipping_delivery_name: "サンプル宅配"
        shipping_date: "2020-01-01"
        tracking_number: "tracking0123"
        note: "出荷しました。"
    ) {
        id
        shipping_delivery_name
        shipping_date
        tracking_number
        note
    }
}

懸念

  • 特にプラグイン化するにあたって4.0.3では対応できない部分が出てこないか

変更履歴

  • 20200410: GraphQLのMutationの仕様を見直し
  • 20200413: GraphQL Mutationの仕様(案)を追加

@okazy
Copy link
Contributor

okazy commented Apr 20, 2020

現在いただいているフィードバックを一旦洗い出しました。

EC-CUBE4 Web API β フィードバック

  • 必須の改修、実装
    • ページング機能
    • 日付の取得
    • 受注ステータス(伝票番号、出荷日、配送会社の更新)の更新
  • 要望
    • 時間単位での取得条件指定(現状日付単位で指定可能、件数的に回避可能だけど本当は欲しい)
    • ProductCodeをキーとして在庫数、価格の取得・更新(ProductClassIdで問題ないか確認中)
    • CreateDateを範囲指定してOrderを取得(OrderDateでも問題ないか確認中)
    • Order.OrderItemsで商品のみ取得(連携側で対応可能だがおそらくあった方が良い)
    • フロントエンドでの利用(当初スコープ外だった要件)
      • Authorization Code Grant以外のGrantのサポートの検討
      • Scopeの細分化の検討
      • 購入のAPI
  • 調査が必要な観点
    • PHPの要件が7.2以上となることへの対応方針
    • 自動テストの作成
    • セキュリティ面での強化
      • 鍵を公開ディレクトリ以下に配置することの是非と対策
      • 全会員データ取得可能となることの是非と対策
      • エンドポイントのアクセス制限
      • OpenID Connectの基準に従った認証機能の要否と対策
      • Authorization Code Interception Attack
      • IdP Mix-Up Attack
    • プラグインでの実装の検証
      • 必要な拡張機構がすべてそろっているか(環境変数やyamlなど)
      • エンドポイントのURLの調整
    • 配送会社の更新
      • 配送業者は文字列で受注に保存されてる。変更しても管理画面での受注編集で戻ってしまう。

@nanasess
Copy link
Contributor

ProductCodeをキーとして在庫数、価格の取得・更新(ProductClassIdで問題ないか確認中)

基幹連携などで在庫などの商品情報を更新する場合は、基幹側にマスタ連携する必要が生じるため、ProductClassId だと使えないです。
商品コード(SKU)がベター

@nanasess
Copy link
Contributor

鍵を公開ディレクトリ以下に配置することの是非と対策

鍵はデータベースに入れた方が無難かなと

@ryo-endo ryo-endo pinned this issue May 11, 2020
@okazy
Copy link
Contributor

okazy commented May 29, 2020

APIプラグイン化に向けた課題

  • PHP7.2以上 (oauth2-bundleの要件)
  • プラグインでのbundleインストールの検証
  • yamlファイルの追加および変更の検証
  • プラグインでの環境変数の設定の検証

@atsuyuki-inui
Copy link

現状EC-CUBEを利用したwebサイトを運営しており、アプリ化を検討しております。
およそで結構ですのでAPI開発の今後のスケジュールの目処を教えていただけませんか?

@okazy
Copy link
Contributor

okazy commented Jun 11, 2020

@atsuyuki-inui
リリーススケジュールは決まっていないのですが、リリースは8月以降になるかと思います。
エンドユーザ向けのアプリ化を検討されておられるのかと思いますが、開発中のAPIは「外部サービスと連携するためWeb API」となります。
リリースされましてもそのままでは利用できないかと思いますのでご注意ください。

@atsuyuki-inui
Copy link

@okazy ご回答頂きありがとうございます。エンドユーザ向けのアプリとなります。アプリからGraphQL API(Query、Mutation)を叩いてEC-CUBEの機能を使う想定でいました。仕様が固まるのはいつ頃になりますでしょうか?

@chihiro-adachi chihiro-adachi unpinned this issue Jun 30, 2020
@okazy
Copy link
Contributor

okazy commented Jul 1, 2020

@atsuyuki-inui
EC-CUBE 4.1 のロードマップが公開されました。

#4603

API関連を抜粋すると以下かと思います。

  • ~9月: API開発
  • ~12月: 4.0.5開発

APIの開発は~9月ですが、プラグインでの提供となり、4.0.5以降でないと使えない可能性があります。

@okazy
Copy link
Contributor

okazy commented Jul 1, 2020

APIのプラグイン化に向けたリポジトリが作成されました。
https://github.com/EC-CUBE/eccube-api4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
affected:外部仕様 外部仕様の変更や追加 enhancement 機能追加 Status: discussion
Projects
None yet
Development

No branches or pull requests

6 participants