> ## Documentation Index
> Fetch the complete documentation index at: https://developer.box.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 認証

> Boxの認証方法を比較し、それぞれで必要な資格情報とファイルを確認して、返されるアクセストークンが何を表しているのかを説明します。

export const SignupCTA = ({children}) => {
  return <div className="flex flex-wrap items-center gap-4 p-5 rounded-lg border border-gray-200 dark:border-gray-700 my-6" style={{
    background: "linear-gradient(135deg, rgba(0, 97, 213, 0.06), rgba(0, 97, 213, 0.02))"
  }}>
      <div className="flex-1 text-sm leading-relaxed text-gray-700 dark:text-gray-300" style={{
    minWidth: "280px"
  }}>
        {children}
      </div>
      <div className="flex flex-col items-center gap-2">
        <a href="https://account.box.com/signup/developer" className="signup-cta-button inline-flex items-center whitespace-nowrap px-5 py-2 text-sm font-semibold text-white no-underline">
          {translate("Get started for free")}
        </a>
        <a href="https://account.box.com/developers/console" className="signup-cta-login text-xs text-gray-500 dark:text-gray-400 no-underline whitespace-nowrap">
          {translate("Already have an account? Log in")}
        </a>
      </div>
    </div>;
};

export const Link = ({href, children, className, ...props}) => {
  const localizedHref = localizeLink(href);
  return <a href={localizedHref} className={className} {...props}>
      {children}
    </a>;
};

各Box APIコールには[アクセストークン](#the-access-token)が含まれており、そのトークンによって、呼び出しがどのユーザーとして振る舞うのかがBoxに通知されます。アプリは資格情報をBoxと交換することでトークンを取得し、その交換方法が**認証方法**となります。

利用可能な方法は、<Link href="https://app.box.com/developers/console">開発者コンソール</Link>で<Link href="/guides/applications/platform-apps/index">Platformアプリ</Link>を作成する際に選択した**アプリの種類**によって異なります。その選択の判断は突き詰めれば、ユーザーがBoxにサインインしてアプリを使用するのか、それともアプリが単独で実行されるのかという1つの質問にたどり着きます。

* ユーザーがサインインするアプリは**ユーザー**アプリであり、常に**OAuth 2.0**を使用します。
* 単独で実行されるアプリは**サーバー**アプリであり、**クライアント資格情報許可 (CCG)** または**JWT**のどちらかを使用します。

## 認証方法の概要

認証方法は、アプリが正当性を証明する方法と、取得したトークンでアクセスできるコンテンツの範囲によって異なります。

| | [OAuth 2.0](#oauth-20) | [CCG](#client-credentials-grant) | [JWT](#jwt) |
| - | - | - | - |
| **アプリの種類** | ユーザー | サーバー | サーバー |
| **IDの証明方法** | クライアントシークレットとユーザーの同意 | クライアントシークレット | 公開/秘密キーペア |
| **管理者による承認または有効化が必要** | Enterprise設定により異なる | はい | はい |
| **他のユーザーの代理で操作可能** | 追加のセットアップが必要 | はい | はい |
| **App Userを作成可能** | いいえ | はい | はい |
| **最適な用途** | ユーザーが自身のBoxアカウントでサインインするアプリ | バックエンドサービス、自動化、統合 | 公開/秘密キーペアを必要とするバックエンドサービス |

サーバーアプリは、APIを呼び出す前に承認される必要があります。OAuth 2.0アプリは、企業が未公開アプリをデフォルトで非アクティブにしている場合のみ、Boxの管理者または共同管理者が有効化する必要があります。<Link href="/guides/authorization/platform-app-approval">Platformアプリの承認</Link>で両方のケースが解説されています。

<Warning>
  ユーザーアプリをサーバーアプリに変換したり、サーバーアプリをユーザーアプリに変換したりすることはできません。変更するには新しいアプリを作成してください。
</Warning>

<Card href={localizeLink("/guides/authentication/jwt/jwt-setup")} arrow title="JWT認証を設定する" />

<Card href={localizeLink("/guides/authentication/tokens/access-tokens")} arrow title="Boxのアクセストークンについて確認する" />

<Card href={localizeLink("/guides/authentication/tokens/developer-tokens")} arrow title="開発者トークンの生成" />

<SignupCTA>
  無料のDeveloperアカウントを作成すると、開発者コンソールにアクセスして、アプリの作成、認証の構成、アクセストークンの生成を行うことができます。
</SignupCTA>

本番環境のデータに影響を及ぼすことなく認証を試すには、[Developerサンドボックス](/guides/getting-started/sandbox)を使用してください。

## OAuth 2.0

OAuth 2.0は、ユーザーがアプリケーションに対して、別のアプリケーション内のデータへのアクセスを許可できるようにする[オープンスタンダード](https://oauth.net/2/)です。もしGoogleやFacebookでウェブサイトにサインインしたことがあるなら、すでにこの技術を利用しています。Boxも同様のフローを採用しています。アプリがユーザーをBoxに誘導し、ユーザーがログインしてリクエストを承認すると、Boxが承認コードを返し、アプリがそれをアクセストークンと交換します。

トークンはサインインしたユーザーに属するため、アプリはユーザーが所有またはコラボレーションしているコンテンツにのみアクセスでき、作成されるコンテンツはユーザー自身のアカウントに保存されます。

ユーザーがすでにBoxアカウントを所有しており、ユーザー自身でBoxにサインインさせたい場合は、OAuth 2.0を選択します。

<Card href={localizeLink("/guides/authentication/oauth2")} arrow title="OAuth 2.0認証について確認する" />

## クライアント資格情報許可

クライアント資格情報許可 (CCG) は、クライアントIDとクライアントシークレットを使用してアプリケーションのIDを検証し、アクセストークンを直接返します。誰もログインしないので、無人で実行するコードに適しています。CCGは、サーバーアプリの作成時に事前選択されています。

各トークンリクエストでは、認証対象となるサブジェクトを指定します。すなわち、アプリケーションの<Link href="#service-accounts">サービスアカウント</Link>か、アプリの構成上許可されている場合は特定のユーザーです。

エンドユーザーが自分のBoxアカウントを所有していないか、IDシステムを通じてサインインする場合は、バックエンドサービス、自動化、統合にCCGを選択します。これらの場合、各ユーザーは独自のフォルダツリーを備える独立したApp Userを取得できます。

<Card href={localizeLink("/guides/authentication/client-credentials")} arrow title="クライアント資格情報許可について確認する" />

## JWT

JSONウェブトークン (JWT) を使用したサーバー認証では、アプリはシークレットをそのまま送信するのではなく、秘密キーを使用して有効期間の短いアサーションに署名し、そのアサーションをアクセストークンと交換します。Boxが保持するのは対応する公開キーのみであるため、秘密キーがユーザーのインフラストラクチャ外に出ることはありません。

JWTではCCGと同じサービスアカウントモデルを使用でき、独立したApp Userも使用できます。アサーションがクライアントシークレットを置き換えることはなく、トークンリクエストには引き続きクライアントシークレットが含まれます。このため、JWTでは資格情報を別のものに置き換えるのではなく、交換のプロセスに追加の要素を導入する仕組みとなっています。

<Card href={localizeLink("/guides/authentication/jwt")} arrow title="JWT認証について確認する" />

## CCGとJWTのどちらかの選択

どちらの方法でも、同じサービスアカウント、App User、コンテンツにアクセスするため、選択の判断基準は、アプリがどのように正当性を証明し、資格情報の管理をどこまで独自に行いたいかによります。

セキュリティレビューでキーペアベースの検証が必要な場合、または秘密キーを自社のインフラストラクチャ内に保持したい場合は、JWTを選択してください。Boxは公開キーのみを保存するため、クライアントシークレットが漏えいしても、それだけではトークンを取得することはできません。その際のコストは、キーペアの生成、秘密キーとそのパスフレーズの保護、ローテーション時の新しい公開キーのアップロードなど、キー管理に関連するものです。

それ以外の場合はCCGを選択してください。CCGはキーやアサーション署名が不要なため、よりシンプルな選択肢となっており、Boxがほとんどのサーバーアプリで推奨している方法です。

すでにアプリが存在する場合に方法を変更できるかどうかは、Enterprise設定によって異なります。方法を変更すると、以前の方法に関連付けられていた資格情報は取り消されます。

<Card href={localizeLink("/guides/authentication/switch-server-auth-type")} arrow title="既存アプリのCCGとJWTの切り替え" />

## 方法ごとの資格情報

方法ごとに異なる値のセットが必要であり、それらはすべて<Link href="https://app.box.com/developers/console">開発者コンソール</Link>のアプリの \[**構成**] タブから取得できます。

| メソッド | 必要な値 | 値を取得できる場所 |
| - | - | - |
| OAuth 2.0 | クライアントID、クライアントシークレット、1つ以上のリダイレクトURI | IDとシークレットは、\[**構成**] タブで確認できます。リダイレクトURIは、\[**OAuth 2.0リダイレクトURI**] セクションで登録します。URIは、送信する`redirect_uri`と正確に一致している必要があります。 |
| クライアント資格情報許可 | クライアントID、クライアントシークレット、認証対象となるサブジェクト (`box_subject_type`が`enterprise`ならEnterprise ID、`user`ならユーザーID) | IDとシークレットは、\[**構成**] タブで確認できます。Enterprise IDとユーザーIDについては、<Link href="/guides/getting-started/locating-values">IDの確認</Link>を参照してください。 |
| JWT | クライアントID、クライアントシークレット、公開キーID、暗号化された秘密キー、パスフレーズ、Enterprise ID | \[**公開キーの追加と管理**] セクションで \[**公開/秘密キーペアを生成**] を選択すると、6つの値がすべて入った`config.json`がダウンロードされます。代わりに独自のキーペアを生成する場合には、秘密キーとパスフレーズをご自身で保管のうえ、それ以外の値を \[**構成**] タブから取得します。 |

<Note>
  クライアントシークレットの表示やキーペアの生成に際しては、Boxアカウントで[多要素認証 (MFA)](https://support.box.com/hc/en-us/articles/360043697154-Multi-Factor-Authentication-Set-Up-for-Your-Account) を有効にしておく必要があります。
</Note>

### 資格情報ファイルがある場所

認証方法としてJWTを選択した場合のみ、Boxからユーザーにファイルを渡す処理が発生します。開発者コンソールで \[**公開/秘密キーペアを生成**] を選択すると、キーペアと認証に必要なアプリケーションの詳細が記載された`config.json`がダウンロードされます。そのファイルをソースコントロールの外部の安全な場所に保管しておき、実行時に読み込んでください。あるいは、同じ値を環境変数やシークレットマネージャから読み込むという方法もあります。ファイルの内容とその読み込み方法の詳細については、<Link href="/guides/authentication/jwt/with-sdk">SDKを使用したJWT</Link>ガイドを参照してください。

独自のキーペアを生成し、公開キーのみをアップロードした場合には、`config.json`のダウンロードは発生しません。秘密キーはアプリケーションが起動時に読み取ることができる場所、パスフレーズはキーとは別の場所に、それぞれ保管しておいてください。残りの値は、\[**構成**] タブで確認のうえ読み込ませます。OAuth 2.0とCCGを使用するアプリではファイルが存在しないため、クライアントIDとクライアントシークレットは環境変数やシークレットマネージャに保存してください。

<Warning>
  Boxには秘密キーが保存されません。秘密キーを紛失した場合は、キーペア全体のリセットが必要になります。

  `config.json`やクライアントシークレットは、リポジトリにコミットしないようにしてください。`.gitignore`に追加しておけば、そのような事態を予防できます。また、メールで送信したり、公開フォーラムに投稿したり、配布するネイティブアプリケーションやクライアント側のコードに含めたりしないようご注意ください。ブラウザのコードからBoxにアクセスする場合には、先にトークンを<Link href="/guides/authentication/tokens/downscope">ダウンスコープ</Link>してください。
</Warning>

<Card href={localizeLink("/guides/authentication/best-practices")} arrow title="認証のベストプラクティスを確認する" />

## アクセストークン

どの方法でも、最終的な流れは同じです。Boxからアクセストークンが返されると、アプリがそのトークンを各APIコールの`Authorization`ヘッダーに追加して送信します。トークンの有効期間は60分間ですが、正確な有効期間はレスポンスの`expires_in`という項目に秒単位で記載されています。

```sh theme={null}
curl https://api.box.com/2.0/users/me \
    -H "authorization: Bearer [ACCESS_TOKEN]"
```

上記の仕組みを構築する前にエンドポイントを呼び出す場合には、開発者コンソールから手動で<Link href="/guides/authentication/tokens/developer-tokens">開発者トークン</Link>を生成します。開発者トークンは、別個の認証方法ではありません。あくまでも通常のアクセストークンの一種であり、有効期間は同じく60分間です。ただし、コンソールにサインイン済みのユーザー個人に紐付いたものであるため、開発目的以外には使用しないでください。

### 各方法のトークンのリクエスト方法

どの方法でも、トークンのリクエスト元エンドポイントが`https://api.box.com/oauth2/token`であるという点は共通していますが、送信する`grant_type`とそれに付随するパラメータは異なります。OAuth 2.0の場合、このリクエストは最後に送られます。具体的には、ユーザーがBoxへのサインインと同意を終えた後にリクエストが送信されます。

<CodeGroup>
  ```sh OAuth 2.0 theme={null}
  curl -X POST https://api.box.com/oauth2/token \
      -d "grant_type=authorization_code" \
      -d "code=[CODE]" \
      -d "client_id=[CLIENT_ID]" \
      -d "client_secret=[CLIENT_SECRET]"
  ```

  ```sh Client Credentials Grant theme={null}
  curl -X POST https://api.box.com/oauth2/token \
      -d "grant_type=client_credentials" \
      -d "client_id=[CLIENT_ID]" \
      -d "client_secret=[CLIENT_SECRET]" \
      -d "box_subject_type=enterprise" \
      -d "box_subject_id=[ENTERPRISE_ID]"
  ```

  ```sh JWT theme={null}
  curl -X POST https://api.box.com/oauth2/token \
      -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
      -d "assertion=[JWT_ASSERTION]" \
      -d "client_id=[CLIENT_ID]" \
      -d "client_secret=[CLIENT_SECRET]"
  ```
</CodeGroup>

OAuth 2.0では、ユーザーによる同意の後にBoxから返される`code`が必要になります。これに対してJWTでは、秘密キーを使って署名したアサーションが必要です。<Link href="/guides/authentication/jwt/without-sdk">SDKを使用しないJWT</Link>ガイドでは、このアサーションの構築方法を解説しています。なお、<Link href="/guides/authentication/tokens/sdks">SDK</Link>を使えば、どちらの手順も自動化が可能です。

### 返されるもの

トークンと一緒に送られてくるものは方法に応じて異なり、それによってトークンの有効期限が切れた後のアプリの動作が変わります。

| メソッド | トークンのレスポンスに含まれるもの | 次のトークンの取得方法 |
| - | - | - |
| OAuth 2.0 | アクセストークンと更新トークン | 更新トークンを交換して新しいペアを取得 |
| クライアント資格情報許可 | アクセストークン | 同じクライアント資格情報で新しいアクセストークンをリクエスト |
| JWT | アクセストークン | 新しいアサーションに署名し、それを交換 |

更新トークンの有効期間は60日間で、使用できるのは1回のみです。そのため、OAuth 2.0アプリではユーザーごとに最新の更新トークンを保存し、更新がないまま60日が経過したユーザーに対しては承認を再送します。CCGアプリとJWTアプリの場合には、新しいトークンが必要になった時点でリクエストするので、このような処理は発生しません。

### トークンが表すユーザー

アクセストークンはいずれも1名のBoxユーザーにマッピングされており、アプリがアクセスできる範囲と新しいコンテンツの保存先は、そのユーザーによって決まります。もっとも、トークンがコンテンツに対して何ができるかは、ユーザーに与えられている権限よりもさらに狭く、ユーザーのアクセス権限と、ユーザーがアプリケーションに許可した<Link href="/guides/api-calls/permissions-and-errors/scopes">スコープ</Link>が重なり合う範囲のみに限定されます。そのため、ユーザーがファイルを閲覧できる場合でも、呼び出しに失敗することがあります。

| メソッド | デフォルトのユーザー | コンテンツがある場所 |
| - | - | - |
| OAuth 2.0 | アクセス権限を付与した人物 | そのユーザーのアカウント |
| クライアント資格情報許可 | サービスアカウント | そのサービスアカウントのフォルダツリーまたはApp Userのフォルダツリー |
| JWT | サービスアカウント | そのサービスアカウントのフォルダツリーまたはApp Userのフォルダツリー |

Boxアカウントにはそれぞれに独自のフォルダツリーが用意されており、そのツリーのルートはいずれもフォルダID `0`となっています。そのため、同じアップロード呼び出しであっても、一緒に送信するトークンに応じてアップロード先が変わることがあります。OAuth 2.0トークンの場合には、サインイン済みのユーザーのアカウントにファイルがアップロードされます。これに対して、サービスアカウントトークンの場合には、(他のユーザーに共有するまでは) そのアプリケーション以外はアクセスできない場所にファイルがアップロードされます。ツリーの垣根を越えてファイルが移動することはないため、アプリが既存のコンテンツを操作する必要がある場合には、あらかじめアカウントにアクセス権限を付与しておく必要があります。

### サービスアカウント

サービスアカウントは、プログラムによる仮想的なユーザーで、Box Enterprise内のアプリケーションを表すものです。サービスアカウントは、JWTアプリやCCGアプリが<Link href="/guides/authorization/platform-app-approval">承認</Link>された時点で自動的に生成されるため、ユーザーが自ら作成することはありません。ログイン資格情報はなく、さまざまな操作をAPI経由で行うことから、バックエンド統合に適しています。サービスアカウントのメールアドレス`@boxdevedition.com`は、アプリの \[**アプリの詳細**] タブで確認できます。隣には、コンテンツマネージャでそのアカウントを開くためのリンクも用意されています。

サービスアカウントは、最初はフォルダツリーが空になっており、ユーザーがアクセス権限を与えるまでは、既存のファイルにアクセスできません。サービスアカウントのメールアドレスを使ってコラボレータとして招待するか、ユーザーIDを指定して<Link href="/reference/post-collaborations">コラボレーション作成エンドポイント</Link>を呼び出します。ストレージ容量、スコープ、管理者がコンテンツを閲覧できる方法は、<Link href="/guides/getting-started/users#service-account">ユーザータイプ</Link>によって決まります。

<Warning>
  アプリが承認される前にサービスアカウントトークンを使用してAPIを呼び出すと、`unauthorized_client`エラーが表示されます (エラーメッセージ: `This app is not authorized by the enterprise`)。
</Warning>

サーバーアプリで扱えるのは、サービスアカウントだけではありません。CCGアプリは、<Link href="/guides/authentication/client-credentials">特定のユーザーのトークン</Link>をリクエストできます。JWTアプリは、<Link href="/guides/authentication/jwt/as-user">as-user</Link>ヘッダーを送信したり、<Link href="/guides/authentication/jwt/user-access-tokens">ユーザーアクセストークン</Link>をリクエストしたりできます。いずれの場合でも、管理対象ユーザーとApp Userはそれぞれ独自のフォルダツリーを保持します。

<Card href={localizeLink("/guides/getting-started/users")} arrow title="ユーザータイプの比較" />

<Card href={localizeLink("/guides/authentication/tokens")} arrow title="トークンの使用、更新、取り消し、ダウンスコープ" />

## アプリトークン

Boxでは、第4の方法が用意されています。<Link href="/guides/embed/box-view">Box View</Link>のプレビューや他のアクセス制限付きアプリの場合に役立つアプリトークン認証です。ただし、一般的なサーバー側統合には、[CCG](#client-credentials-grant)または[JWT](#jwt)の利用をお勧めします。既存のアプリをこの2つのいずれかに移行する方法については、<Link href="/guides/embed/box-view/setup#legacy-limited-access-apps">従来のアクセス制限付きアプリ</Link>を参照してください。

## 次の手順

* <Link href="/guides/authentication/oauth2/oauth2-setup">アプリに対するOAuth 2.0の設定</Link>
* <Link href="/guides/authentication/client-credentials/client-credentials-setup">クライアント資格情報許可によるアプリの設定</Link>
* <Link href="/guides/authentication/jwt/jwt-setup">アプリに対するJWTの設定</Link>
* <Link href="/guides/authorization/platform-app-approval">アプリの承認</Link>
* <Link href="/guides/authorization/common-errors">一般的な承認エラーの解決方法</Link>
* <Link href="/guides/authentication/sso">OAuth 2.0を使ったサインインに対するSSOの影響</Link>
