API認証ガイド

API認証 OAuth 2.0 認可コード 開発者ガイド

認証ガイド

レシートローラー APIはOAuth 2.0 認可コードフローを使用します。 サードパーティの開発者がアプリを登録し、ビジネスオーナーがアクセスを許可すると、開発者はトークンを取得してAPIを呼び出すことができます。


ステップ1:アプリを登録する

  1. レシートローラーアカウントにログインします
  2. ビジネスアカウント詳細⋮ メニュー開発者アプリ に移動します
  3. アプリを作成 をクリックします
  4. アプリ名、リダイレクトURI、必要なAPIスコープを入力・選択します
  5. 作成後、client_idclient_secret が発行されます
⚠ 重要:client_secret一度だけ表示されます。必ずコピーして安全に保管してください。紛失した場合は再生成が必要です(既存のシークレットは即座に無効になります)。

ステップ2:ビジネスオーナーを認可画面にリダイレクトする

ビジネスオーナーがアプリにアカウントを連携する際、ブラウザを以下のURLにリダイレクトします:

GET https://your-domain/oauth/authorize
    ?client_id=YOUR_CLIENT_ID
    &redirect_uri=YOUR_REDIRECT_URI
    &response_type=code
    &scope=store.products.read store.orders.read
    &state=RANDOM_STATE_STRING
パラメータ 必須 説明
client_id はい アプリのクライアントID
redirect_uri はい アプリに登録されたリダイレクトURIと完全一致する必要があります
response_type はい code を指定してください
scope はい スペース区切りのスコープ一覧(下記の利用可能なスコープを参照)
state 推奨 CSRF攻撃を防ぐためのランダム文字列。コールバック時にそのまま返されます。
code_challenge 任意 PKCEコードチャレンジ(code_verifierのSHA-256ハッシュをbase64urlエンコード)
code_challenge_method 任意 S256(PKCE使用時は必須)

ビジネスオーナーには、アプリ名と要求されるアクセス権限が表示された同意画面が表示されます。許可または拒否を選択できます。


ステップ3:認可コードを受け取る

許可された場合、ビジネスオーナーのブラウザが redirect_uri にリダイレクトされます:

GET https://your-app.com/callback
    ?code=AUTHORIZATION_CODE
    &state=RANDOM_STATE_STRING

拒否された場合:

GET https://your-app.com/callback
    ?error=access_denied
    &state=RANDOM_STATE_STRING
ℹ 注意: 認可コードの有効期限は10分間で、一度しか使用できません。

ステップ4:コードをトークンに交換する

サーバーサイドから(ブラウザではなく)、以下のPOSTリクエストでコードをアクセストークンに交換します:

POST /api/v1/auth/token
Content-Type: application/json

{
    "grantType": "authorization_code",
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET",
    "code": "AUTHORIZATION_CODE",
    "redirectUri": "YOUR_REDIRECT_URI"
}

成功レスポンス(200):

{
    "accessToken": "aBcDeFgH1234567890...",
    "refreshToken": "xYzAbCdEfG098765...",
    "tokenType": "Bearer",
    "expiresIn": 3600,
    "scope": "store.products.read store.orders.read"
}
フィールド 説明
accessToken APIを呼び出す際に使用します。有効期限は1時間です。
refreshToken アクセストークンの有効期限が切れた際に、新しいトークンを取得するために使用します。有効期限は30日間です。
expiresIn トークンの有効期間(秒)。3600 = 1時間
scope ビジネスオーナーが承認したスコープ

ステップ5:APIを呼び出す

アクセストークンを Authorization ヘッダーに含めてリクエストします:

GET /api/v1/store/products
Authorization: Bearer aBcDeFgH1234567890...
Content-Type: application/json

APIは、アプリを認可したビジネスアカウントに紐づくデータを返します。承認されたスコープで許可されたデータのみアクセス可能です。


ステップ6:期限切れトークンをリフレッシュする

アクセストークンの有効期限が切れた場合、リフレッシュトークンを使用して新しいトークンペアを取得します:

POST /api/v1/auth/token
Content-Type: application/json

{
    "grantType": "refresh_token",
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET",
    "refreshToken": "xYzAbCdEfG098765..."
}

レスポンス形式はステップ4と同じです。古いアクセストークンとリフレッシュトークンは無効化され、新しいペアが返されます。


トークンの取り消し

アクセストークンまたはリフレッシュトークンを取り消すには:

POST /api/v1/auth/revoke
Content-Type: application/json

{
    "token": "取り消すトークン",
    "clientId": "YOUR_CLIENT_ID"
}

ビジネスオーナーは、アカウント設定からいつでもアプリのアクセスを取り消すことができます。


エラーレスポンス

HTTPステータス エラー 説明
400 unsupported_grant_type authorization_coderefresh_token のみサポートされています
400 invalid_request 必須パラメータが不足しています
401 invalid_grant 無効なコード、期限切れのコード、認証情報の不一致、またはリダイレクトURIの不一致
400 invalid_client 不明なclient_id
400 invalid_redirect_uri redirect_uriが登録されたURIと一致しません

利用可能なスコープ

Store(店舗)

スコープ 説明
store.products.read 商品・在庫情報を取得します
store.products.write 商品の作成・更新を行います
store.orders.read 注文データを取得します
store.orders.write 注文ステータスを更新します
store.customers.read 顧客データを取得します
store.coupons.read クーポンデータを取得します
store.coupons.write クーポンの作成・更新を行います
store.inventory.read 倉庫・在庫データを取得します

CRM(顧客関係管理)

スコープ 説明
crm.profiles.read CRM顧客プロフィールを取得します
crm.segments.read CRMセグメント・ランクを取得します

SNS / アナリティクス

スコープ 説明
sns.content.read SNS投稿データを取得します
sns.audience.read SNSオーディエンスデータを取得します
analytics.read 分析スナップショットを取得します

フロー図

┌──────────────┐     ┌──────────────┐     ┌──────────────────┐
│  あなたのアプリ │     │ ビジネス      │     │  ReceiptRoller   │
│  (開発者)    │     │ オーナー      │     │  プラットフォーム  │
└──────┬───────┘     └──────┬───────┘     └────────┬─────────┘
       │                    │                      │
       │  1. /oauth/authorize にリダイレクト         │
       │───────────────────►│─────────────────────►│
       │                    │                      │
       │                    │  2. 同意画面を表示     │
       │                    │◄─────────────────────│
       │                    │                      │
       │                    │  3. 許可する           │
       │                    │─────────────────────►│
       │                    │                      │
       │  4. ?code=認可コード でリダイレクト          │
       │◄───────────────────│◄─────────────────────│
       │                    │                      │
       │  5. POST /api/v1/auth/token               │
       │  (code + client_id + client_secret)      │
       │──────────────────────────────────────────►│
       │                                           │
       │  6. { accessToken, refreshToken }         │
       │◄──────────────────────────────────────────│
       │                                           │
       │  7. GET /api/v1/store/products            │
       │  Authorization: Bearer {accessToken}      │
       │──────────────────────────────────────────►│
       │                                           │
       │  8. { data: [...] }                       │
       │◄──────────────────────────────────────────│

セキュリティのベストプラクティス

  • client_secret はサーバーサイドにのみ保管してください。フロントエンドのコードやモバイルアプリには絶対に含めないでください。
  • CSRF攻撃を防ぐため、state パラメータを必ず検証してください。
  • モバイルアプリやシングルページアプリケーションでは、PKCE(code_challenge / code_verifier)を使用してください。
  • トークンは安全に保管してください。アクセストークンをログに記録したり、URLに含めたりしないでください。
  • サービスの中断を避けるため、有効期限が切れる前にトークンのリフレッシュを実装してください。
  • アプリが実際に必要とするスコープのみをリクエストしてください。
公開日: 2026-03-27 更新日: 2026-03-27