Skip to content

Commit

Permalink
Merge branch 'master' into dev/scope
Browse files Browse the repository at this point in the history
  • Loading branch information
Kiyotaka Oku committed Jul 30, 2020
2 parents 149419e + b25c582 commit 1b7ec61
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 70 deletions.
2 changes: 2 additions & 0 deletions Controller/Admin/OAuthController.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ public function create(Request $request)
*/
public function delete(Request $request, string $identifier)
{
$this->isTokenValid();

$client = $this->clientManager->find($identifier);
if (null === $client) {
$this->addError('admin.common.delete_error_already_deleted', 'admin');
Expand Down
23 changes: 16 additions & 7 deletions Controller/ApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use Plugin\Api\GraphQL\Schema;
use Plugin\Api\GraphQL\ScopeValidationRule;
use Plugin\Api\GraphQL\Types;
use RuntimeException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelInterface;
Expand Down Expand Up @@ -60,18 +61,26 @@ public function __construct(
}

/**
* @Route("/api", name="api", methods={"POST"})
* @Route("/api", name="api", methods={"GET", "POST"})
* @Security("has_role('ROLE_OAUTH2_READ') or has_role('ROLE_OAUTH2_WRITE')")
*/
public function index(Request $request)
{
$body = json_decode($request->getContent(), true);
$schema = $this->schema;
$query = $body['query'];
$variableValues = isset($body['variables']) ? $body['variables'] : null;
switch ($request->getMethod()) {
case 'GET':
$query = $request->get('query');
$variableValues = json_decode($request->get('variables'), true);
break;
case 'POST':
$body = json_decode($request->getContent(), true);
$query = $body['query'];
$variableValues = isset($body['variables']) ? $body['variables'] : null;
break;
default:
throw new RuntimeException();
}

DocumentValidator::addRule($this->scopeValidationRule);
$result = GraphQL::executeQuery($schema, $query, null, null, $variableValues);
$result = GraphQL::executeQuery($this->schema, $query, null, null, $variableValues);

if ($this->kernel->isDebug()) {
$debug = DebugFlag::INCLUDE_DEBUG_MESSAGE | DebugFlag::INCLUDE_TRACE;
Expand Down
2 changes: 1 addition & 1 deletion Resource/template/admin/OAuth/index.twig
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ file that was distributed with this source code.
<div class="text-right">
<div class="px-1 d-inline-block">
<div class="d-inline-block mr-2" data-tooltip="true"
data-placement="top" title="{{ 'api.admin.common.delete'|trans }}">
data-placement="top" title="{{ 'admin.common.delete'|trans }}">
<a class="btn btn-ec-actionIcon action-delete" data-toggle="modal"
data-target="#oauth_delete_{{ client.identifier }}">
<i class="fa fa-close fa-lg text-secondary" aria-hidden="true"></i>
Expand Down
46 changes: 46 additions & 0 deletions docs/_pages/authZ_code_grant.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
layout: home
author_profile: true
permalink: /authZ_code_grant
---
## Authorization Code Flow での認可

### API クライアント の登録方法

1. プラグインを有効化すると、 **管理画面→設定→API管理→OAuth管理** に API クライアント一覧画面が表示されます。
1. **新規登録** ボタンをクリックすると、登録画面が表示されます。
1. **リダイレクトURI**`https://<ec-cubeのホスト名>/` を入力します。
- 上記の設定はテスト用の一例ですので、お使いの API クライアントにあわせて設定してください。
1. **登録** ボタンをクリックすると、API クライアントが登録されます。

### アクセストークンを発行する

ここでは、参考までに curl コマンドを使用して、アクセストークンを発行します。

1. 以下のURLにブラウザでアクセスします。`client_id` などの各項目は、前項で登録した API クライアントのものを使用してください。
- `https://<ec-cubeのホスト名>/<管理画面URL>/authorize?response_type=code&client_id=client_id>&redirect_uri=<リダイレクトURI>&scope=read&state=<ランダム文字列>`
1. 管理画面のログイン画面が表示されますので、ログイン(認証)します。
1. API クライアントの認可画面が表示されますので、内容を確認し、「許可」をクリックします。
1. リダイレクトURIにリダイレクトされますので、 `code` の値をコピーしておきます。
1. curl コマンドでトークンエンドポイントにアクセスします。
- Authorization code の有効期限内(10分)にアクセスしてください。
- `client_id` などの各項目は、前項で登録した API クライアントのものを使用してください。
```sh
curl --location --request POST 'https://<ec-cubeのホスト名>/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=<クライアントID>' \
--data-urlencode 'client_secret=<クライアントシークレット>' \
--data-urlencode 'redirect_uri=<リダイレクトURL>' \
--data-urlencode 'code=<4 で取得した code の値>'
```
1. API クライアントが認可されると、以下のようなアクセストークンが発行されます。
```json
{
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImIwODc0MmY1NzJjZjM3OGFiMjk5NmIwYWVjOTFhODNiMWUwZWVlMTg4OTEyMDUxN2Y0ZWVjMmJhNDVkNTFhMzdkOGU4MDNiNDQ2ZmEyOTU4In0.eyJhdWQiOiJlYmQ3NDZlM2E0MjcxNGE2M2YyYjI0N2JmOWI0MjUwNiIsImp0aSI6ImIwODc0MmY1NzJjZjM3OGFiMjk5NmIwYWVjOTFhODNiMWUwZWVlMTg4OTEyMDUxN2Y0ZWVjMmJhNDVkNTFhMzdkOGU4MDNiNDQ2ZmEyOTU4IiwiaWF0IjoxNTgyNzc5NzM4LCJuYmYiOjE1ODI3Nzk3MzgsImV4cCI6MTU4Mjc4MzMzOCwic3ViIjoiYWRtaW4iLCJzY29wZXMiOlsicmVhZCJdfQ.gTbfzr2nzy-wUmYleXlFq1gs-wN7oH8l5nfEsfq5QAZjkl4K4__uLlh2GpStmjveYqY-rxP7Qy7mUBXgIFH3tl0Tnwg52GH9_ftAhz6ZzPilymUzuXtmJ3aj4GZ4Ctm62GtcM1psbzP444BnY9QYuejpQT3tV0VS1enrV8ZkAPKkWvCcOyGLCabfPZ626rThMxMC0I7Mwc-sHAooZ4ebsDUbAQnXj2mwc5zWUpv7r8AsLXnUaMZoAXSk9NQnZvqn7VXo4EkQJkdArT0_QPoPZvFxHrAI5lMWTojMXCZyQMH6cV4OllKHqluij16NA9dGjG73kETyhzbgsm-8e0Hxww",
"refresh_token": "def502003895e9eb8526f5160b756233895390044561b7de0d67a7a5ae1cef188ed549d95184fb3c824b50e8c6afbe065336e5c18691a750793d1dc8b3d4176f536b1dad6f5c38585133ef0ae44ceac721c65b33b9a8f78c40662112c548acfb3cd4da8b0733c79ac68c22c560f39ef5b4edb33f2ed52579608a3d80559eec37874637afd60a37f53ed5902bc869cca0ce15e09028fccfc27fd60bae8f28b9a98ce068b53b4094d19de000823f6955f9d80b2925e1340932166bdf5014fc083f9b858d7dd39b7707242eb1465b989e65160748fffef0074bc151bc95c59a6134102b18b0349c86e86035632fb235cecd23528f91ad79a599a7186aaad2c7ddca4884401a679212a757beee84f8bb6f05b03d29542091134fd0a41f2356d84726addf03546f383ac93b861bf01a2a1358a94ea856c9a16242c0c896a6feb76e1aa097b4156883368529eae157c46849c4e62e983976d625916f20280004179af27f609dbd7411d7cf25fec08acc9ee60dfe8efb8d7123f30be9c1c05d5ee362a0c70630de7dc0e0d6dbf9b223"
}
```

147 changes: 85 additions & 62 deletions docs/_pages/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,57 +3,91 @@ layout: home
author_profile: true
permalink: /
---
EC-CUBE4 対応の API プラグイン
EC-CUBE4 対応の Web API プラグイン

仕様の詳細は以下の Issue を参照
外部サービスと連携するため、[GraphQL](https://graphql.org) による Web API 機能を実現します

https://github.com/EC-CUBE/ec-cube/issues/4447
## システム要件

## Quick Start

```sh
composer create-project --no-scripts ec-cube/ec-cube ec-cube "4.0.x-dev" --keep-vcs
cd ec-cube

git fetch origin pull/4625/head:experimental/plugin_bundle
git checkout experimental/plugin_bundle

# DATABASE_URL と DATABASE_SERVER_VERSION を適宜変更
# sed -i -e 's/DATABASE_URL=sqlite:\/\/\/var\/eccube.db/DATABASE_URL=postgres:\/\/postgres@127.0.0.1\/eccube/g' ./.env
# sed -i -e 's/DATABASE_SERVER_VERSION=3/DATABASE_SERVER_VERSION=9/g' ./.env

bin/console eccube:install --no-interaction

# プラグインの保管ディレクトリを作成
mkdir ${PWD}/repos
- PHP 7.2 or higher
- PostgreSQL or MySQL
- SSLサーバー証明書(TLS) は必須

# mockサーバを起動。ここでは9999をポート番号に設定していますが、必要に応じて変更してください
docker run -d --rm -v ${PWD}/repos:/repos -e MOCK_REPO_DIR=/repos -p 9999:8080 eccube/mock-package-api

# mockサーバを参照するように環境変数を定義
echo ECCUBE_PACKAGE_API_URL=http://127.0.0.1:9999 >> .env

# 認証キーを設定
psql eccube -h 127.0.0.1 -U postgres -c "update dtb_base_info set authentication_key='test';"

# パッケージングしたプラグインを配置。例でリンクを記載していますが、パッケージは古い可能性があるので各自でパッケージしたものに置き換えてください。
# cd repos
# wget https://github.com/okazy/eccube-api4/releases/download/beta1/eccube-api4-beta1.tar.gz

# reposディレクトリにプラグインを設置。拡張子はtgzに変更してください
# mv eccube-api4-beta1.tar.gz eccube-api4-beta1.tgz
# cd ..

bin/console server:run --env=dev
```
- *Windows 環境での動作は未確認です*
- *SQLite3 には未対応です*
- *テスト環境の作成には Docker が必要です*

管理画面→オーナーズストア→プラグイン→ **プラグインを探す** からプラグインをインストールできる。
## Quick Start

コマンドラインでインストールする場合は以下を実行する
```
bin/console eccube:composer:require ec-cube/Api
bin/console eccube:plugin:enable --code=Api
```
1. EC-CUBE4 をインストールします。
```sh
composer create-project ec-cube/ec-cube ec-cube "4.0.x-dev" --keep-vcs
```
1. DATABASE_URL と DATABASE_SERVER_VERSION を適宜変更。*(実際の環境に合わせること)*
```sh
## for PostgreSQL
sed -i.bak -e 's/DATABASE_URL=sqlite:\/\/\/var\/eccube.db/DATABASE_URL=postgres:\/\/postgres:password@127.0.0.1\/eccubedb/g' ./.env
sed -i.bak -e 's/DATABASE_SERVER_VERSION=3/DATABASE_SERVER_VERSION=9/g' ./.env
```

```sh
## for MySQL
sed -i.bak -e 's/DATABASE_URL=sqlite:\/\/\/var\/eccube.db/DATABASE_URL=mysql:\/\/root:password@127.0.0.1\/eccubedb/g' ./.env
sed -i.bak -e 's/DATABASE_SERVER_VERSION=3/DATABASE_SERVER_VERSION=5.7/g' ./.env
```

1. [本プラグイン対応用のブランチ](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)をチェックアウトします。
```sh
cd ec-cube
git fetch origin pull/4625/head:experimental/plugin_bundle
git checkout experimental/plugin_bundle
```
1. EC-CUBEオーナーズストアのモックサーバーをセットアップします。

``` sh
# プラグインの保管ディレクトリを作成
mkdir ${PWD}/repos
# mockサーバを起動。ここでは9999をポート番号に設定していますが、必要に応じて変更してください
docker run -d --rm -v ${PWD}/repos:/repos -e MOCK_REPO_DIR=/repos -p 9999:8080 eccube/mock-package-api
# mockサーバを参照するように環境変数を定義
echo ECCUBE_PACKAGE_API_URL=http://127.0.0.1:9999 >> .env
```
1. 認証キーを設定します。

```sh
## for PostgreSQL
psql eccubedb -h 127.0.0.1 -U postgres -c "update dtb_base_info set authentication_key='test';"
```

```sh
## for MySQL
mysql -h 127.0.0.1 --user=root --password=password -e "update dtb_base_info set authentication_key='test';" eccubedb
```

1. プラグインのパッケージを配置します。

``` sh
cd repos
# パッケージングしたプラグインを配置。例でリンクを記載していますが、パッケージは古い可能性があるので各自でパッケージしたものに置き換えてください。
git clone https://github.com/EC-CUBE/eccube-api4.git
cd eccube-api4
tar cvzf ../Api-1.0.0.tgz *
cd ../../
```


1. ビルトインウェブサーバーを起動
```sh
bin/console server:run
```
1. プラグインをインストールします。
```sh
bin/console eccube:composer:require ec-cube/Api
bin/console eccube:plugin:enable --code=Api
```
- 管理画面→オーナーズストア→プラグイン→ **プラグインを探す** からでもプラグインをインストールできます。
1. [OAuth2.0 による認可](#oauth20-%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%8D%E5%8F%AF) より API クライアントの認可をしてください。
1. [機能仕様](#%E6%A9%9F%E8%83%BD%E4%BB%95%E6%A7%98) より API をコールしてみましょう!

API プラグインの開発のため Git リポジトリで置き換える場合は以下のとおり。
*プラグインをアンインストールすると、 Git リポジトリごと削除されてしまうため注意すること*
Expand All @@ -66,28 +100,17 @@ git clone git@github.com:okazy/eccube-api4.git
mv eccube-api4 Api
```

## OAuth2.0 による認可

## インストール方法

本プラグインを利用するには EC-CUBE 4.0.4 から若干ファイルを変更する必要がある。

変更内容は以下のプルリクの内容となる。

https://github.com/EC-CUBE/ec-cube/pull/4625

初回インストールはパッケージAPI経由でインストールする必要がある。

パッケージ API 経由でのインストール方法は以下のドキュメントを参照のこと。

https://doc4.ec-cube.net/plugin_mock_package_api

また本体の機能として開発していた際のインストール手順や動作確認方法も参考になるかもしれません。
EC-CUBE で Web API を実行する際、顧客情報を参照したり、受注情報を更新する場合などは API クライアントの認可が必要です。

https://doc4.ec-cube.net/api_quickstart_guide
このプラグインでは、 [OAuth2.0](http://openid-foundation-japan.github.io/rfc6749.ja.html) プロトコルをサポートしています。

### 対応するフロー

## OAuth2.0 による認可
Authorization Code Flow のみに対応しています。

- [Authorization Code Flow](authZ_code_grant) の設定方法


## 機能仕様
Expand Down

0 comments on commit 1b7ec61

Please sign in to comment.