
【チュートリアル②】クライアント情報からアクセストークンを取得する
本チュートリアルでは、クライアント情報を取得した後、その情報を利用してアクセストークンを取得するまでを記載します。
アプリの環境設定ページからクライアント情報を確認する
チュートリアル①でアプリを作成したあと、自動的に環境設定ページに遷移します。
もしくは画面左側サイドバーのアプリを選択後、アプリの「概要を見る」から、上部のタブ内から「環境設定」タブを選択します。
クライアントシークレットについての注意点
前回のチュートリアル①でアプリの新規作成後に取得できるクライアントシークレットを使用します。
クライアントシークレットが分からなくなってしまった場合は、アプリの環境設定ページより再発行を行うことができます。
【注意】クライアントシークレットは漏洩リスク最小化のため、アプリの作成時およびクライアントシークレットの再発行時にのみ確認、コピーを行うことができます。
再発行を行った場合は以前のクライアントシークレットは無効になりますのでご注意ください。
リダイレクトURIについて
アプリの環境設定ページにて設定できる「リダイレクトURI」にはOpenID Connectを利用するときにリダイレクトする先のURLを指定します。
詳しくはこちらをご覧ください。
環境ごとのクライアント情報の取り扱いについて
このクライアント情報は開発(サンドボックス)用のものと本番用のものが作成されます。
https://developers.smaregi.dev/apidoc/common/#section/API
また、共通仕様書にある通り、
アクセストークンAPI
サンドボックス環境
https://id.smaregi.dev
プラットフォームAPI
サンドボックス環境
https://api.smaregi.dev
エンドポイントのURLは環境によって違います。
開発するときは開発用のクライアント情報と開発用URL、
本番にリリースときは本番用のクライアント情報と本番用URL
を設定するようにアプリ側で制御しておくことを推奨します。
クライアント情報からアクセストークンを取得する
以降は、開発中であることを想定して開発用のクライアント情報と開発用URLを利用して進めます。
Postmanを利用して取得する
アクセストークン取得APIはhttps://developers.smaregi.dev/apidoc/common/#section/アクセストークンの通り、
https://id.smaregi.dev/app/{契約ID}/token
とあります。
Tips: 契約IDとは?
スマレジと契約した法人・オーナーを示すIDで全て一意に割り振られます。
スマレジ・デベロッパーズに登録した時点で、デベロッパーの皆様にも割り当てられます。
契約IDはスマレジ・デベロッパーズの左上に記載されていますので、こちらから取得してください。

ここで確認した契約IDを{契約ID}の部分と置換しhttps://id.smaregi.dev/app/xxxxx/token
宛にPOST通信を行います。
その他ヘッダーやリクエストボディは共通仕様書をご覧になって設定してください。設定した結果がこちらです。

AuthorizationはBasicAuthを選択し、UsernameにクライアントID、Passwordにクライアントシークレットを設定してください。
HeadersはContent-Typeをapplication/x-www-form-urlencodedを設定します。

Bodyは以下のように設定します。

scopeの値が空ですが、これはアプリの開発に必要なスコープをスマレジ・デベロッパーズで設定した後に、欲しいスコープを値に設定します。ここでは未設定のまま進めます。
この状態でアクセストークン取得APIをコールすると、アクセストークンが取得できます。

PHPを利用して取得する
※以下はサンプルコードです。スマレジはこのコードに対して一切責任を負いません。
<?php
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$clientId = $_ENV['SMAREGI_CLIENT_ID'];
$clientSecret = $_ENV['SMAREGI_CLIENT_SECRET'];
$client = new GuzzleHttp\Client();
$request = new GuzzleHttp\Psr7\Request('POST', $_ENV['SMAREGI_IDP_HOST'] . '/app/' . $_ENV['SMAREGI_SANDBOX_CONTRACT_ID'] . '/token', [
'Authorization' => 'Basic ' . base64_encode($clientId . ':' . $clientSecret),
'Content-Type' => 'application/x-www-form-urlencoded',
], http_build_query([
'grant_type' => 'client_credentials',
'scope' => '',
]));
$accessTokenResult = sendRequestByGuzzle($request);
echo 'PHP Version: ' . PHP_VERSION . PHP_EOL;
echo 'scope: ' . $accessTokenResult['scope'] . PHP_EOL;
echo 'token_type: ' . $accessTokenResult['token_type'] . PHP_EOL;
echo 'expires_in: ' . $accessTokenResult['expires_in'] . PHP_EOL;
echo 'access_token: ' . $accessTokenResult['access_token'] . PHP_EOL;
/**
* @param Psr\Http\Message\RequestInterface $request
* @return mixed|void
*/
function sendRequestByGuzzle(Psr\Http\Message\RequestInterface $request)
{
$client = new GuzzleHttp\Client();
try {
$response = $client->send($request);
} catch (GuzzleHttp\Exception\GuzzleException $e) {
echo $e->getMessage();
exit;
}
try {
$result = json_decode($response->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo $e->getMessage();
exit;
}
return $result;
}
出力結果:

上記のコードはcomposerを利用して、一般的によく使用されているguzzlehttp/guzzleとvlucas/phpdotenvを利用しています。
特に
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
SMAREGI_IDP_HOST=https://id.smaregi.dev
SMAREGI_CLIENT_ID=xxxxxxxxxxxxxxxxxxxx
SMAREGI_CLIENT_SECRET=yyyyyyyyyyyyyyyyyyyy
SMAREGI_SANDBOX_CONTRACT_ID=zzzzzzzzzzzzzzzzzzzz
のように、PHPの実行環境ごとに変数の内容を変更できるようにプログラミングすることを推奨します。
他のプログラミング言語にも同じような機能を持つものがたくさんありますので、参考にしてください。