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

# Node (Express) API：認可

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        let processedChildren = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          processedChildren = processedChildren.replace(new RegExp(key, "g"), value);
        }
        setProcessedChildren(processedChildren);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
      {processedChildren}
    </CodeBlock>;
};

<div id="by-david-patrick">
  ##### David Patrick による執筆
</div>

このチュートリアルでは、Express.js API に認可を追加する方法を説明します。ご利用のアカウント向けに構成されたサンプルを使ってこのクイックスタートを進められるよう、ログインすることをお勧めします。

<Info>
  **Auth0 を初めて利用しますか？** [Auth0 の仕組み](/docs/ja-JP/get-started/auth0-overview) について学び、OAuth 2.0 フレームワークを使用した [API 認証と認可の実装方法](/docs/ja-JP/get-started/authentication-and-authorization-flow) を確認してください。
</Info>

<div id="configure-auth0-apis">
  ## Auth0 API を設定する
</div>

<div id="create-an-api">
  ### API を作成する
</div>

Auth0 Dashboard の [APIs](https://manage.auth0.com/#/apis) セクションで **Create API** をクリックします。API の 名前 と 識別子 を指定します（例: `https://quickstarts/api`）。後でアクセストークン検証を設定する際に、この識別子を `audience` として使用します。**Signing Algorithm** は **RS256** のままにしておきます。

<Frame>![Create API](https://cdn2.auth0.com/docs/1.14550.0/media/articles/server-apis/create-api.png)</Frame>

デフォルトでは、この API はトークンの署名アルゴリズムとして RS256 を使用します。RS256 は秘密鍵/公開鍵ペアを使用するため、トークンは Auth0 アカウントの公開鍵に対して検証されます。公開鍵は [JSON Web Key Set (JWKS)](/docs/ja-JP/secure/tokens/json-web-tokens/json-web-key-sets) 形式で提供されており、[こちら](https://\{yourDomain}/.well-known/jwks.json) からアクセスできます。

<Info>
  API にはデフォルトの RS256 [署名アルゴリズム](/docs/ja-JP/get-started/applications/signing-algorithms) を使用することを推奨します。HS256 アルゴリズムを使用する必要がある場合は、[HS256 integration sample](https://github.com/auth0-samples/auth0-express-api-samples/tree/master/02-Authorization-HS256) を参照してください。
</Info>

<div id="define-permissions">
  ### パーミッションを定義する
</div>

パーミッションを使用すると、特定のアクセストークンを使用してユーザーに代わってリソースへどのようにアクセスさせるかを定義できます。たとえば、ユーザーにマネージャーのアクセスレベルがある場合は `messages` リソースへの読み取りアクセスを許可し、管理者のアクセスレベルがある場合はそのリソースへの書き込みアクセスを許可するといった構成が考えられます。

許可されるパーミッションは、Auth0 Dashboard の [APIs](https://manage.auth0.com/#/apis) セクションにある **Permissions** ビューで定義できます。

<Frame>![Configure Permissions](https://cdn2.auth0.com/docs/1.14550.0/media/articles/server-apis/configure-permissions.png)</Frame>

<Info>
  この例では `read:messages` スコープを使用します。
</Info>

この例では、次の内容を示します。

* 受信した HTTP リクエストの `Authorization` ヘッダー内に JSON Web Token (JWT) が含まれているかを確認する方法。
* Auth0 アカウントの [JSON Web Key Set (JWKS)](/docs/ja-JP/secure/tokens/json-web-tokens/json-web-key-sets) を使用して、そのトークンが有効かどうかを確認する方法。アクセストークンの検証について詳しくは、[アクセストークンを検証する](/docs/ja-JP/secure/tokens/access-tokens/validate-access-tokens)を参照してください。

<div id="validate-access-tokens">
  ## アクセストークンの検証
</div>

<div id="install-dependencies">
  ### 依存関係をインストールする
</div>

このガイドでは、[express-oauth2-jwt-bearer](https://github.com/auth0/node-oauth2-jwt-bearer/tree/main/packages/express-oauth2-jwt-bearer) ミドルウェアを使用して Express API を保護する方法を説明します。

まず、npm を使ってソフトウェア開発キット (SDK) をインストールします。

```bash theme={null}
npm install --save express-oauth2-jwt-bearer
```

<div id="configure-the-middleware">
  ### ミドルウェアを設定する
</div>

`express-oauth2-jwt-bearer` を、ドメインと API 識別子を指定して設定します。

export const codeExample = `// server.js

const express = require('express');
const app = express();
const { auth } = require('express-oauth2-jwt-bearer');

// 認可用ミドルウェア。使用するときは、アクセストークンが存在し、
// Auth0 の JSON Web Key Set に対して検証されている必要があります。
const checkJwt = auth({
  audience: '{yourApiIdentifier}',
  issuerBaseURL: \`https://{yourDomain}/\`,
});`;

<AuthCodeBlock children={codeExample} language="javascript" />

上記の `checkJwt` ミドルウェアは、リクエストに含まれるユーザーのアクセストークンが有効かどうかをチェックします。トークンが有効でない場合、ユーザーがエンドポイントにアクセスしようとすると 401 Authorization エラーが返されます。このミドルウェアは、要求されたリソースにアクセスするために十分なスコープがトークンに含まれているかどうかまではチェックしません。

<div id="protect-api-endpoints">
  ## API エンドポイントを保護する
</div>

次のルートは、以下のリクエストで利用できます。

* `GET /api/public`: 認証不要なリクエストで利用可能
* `GET /api/private`: 追加のスコープを含まないアクセストークンを持つ認証済みリクエストで利用可能
* `GET /api/private-scoped`: `read:messages` スコープが付与されたアクセストークンを持つ認証済みリクエストで利用可能

有効な JWT が必要な個々のルートを保護するには、そのルートを `checkJwt` `express-oauth2-jwt-bearer` ミドルウェアで設定します。

```javascript lines theme={null}
// server.js

// このルートは認証不要
app.get('/api/public', function(req, res) {
  res.json({
    message: 'Hello from a public endpoint! You don\'t need to be authenticated to see this.'
  });
});

// このルートは認証が必要
app.get('/api/private', checkJwt, function(req, res) {
  res.json({
    message: 'Hello from a private endpoint! You need to be authenticated to see this.'
  });
});
```

個々のルートごとに、特定のスコープを要求するよう設定できます。これを行うには、`requiresScope` メソッドを使用する別のミドルウェアを用意します。必要なスコープを指定し、認可を追加したい任意のルートにそのミドルウェアを適用します。

保護したいルートには、`checkJwt` と `requiredScopes` のミドルウェアを渡します。

```javascript lines theme={null}
// server.js
const { requiredScopes } = require('express-oauth2-jwt-bearer');

const checkScopes = requiredScopes('read:messages');

app.get('/api/private-scoped', checkJwt, checkScopes, function(req, res) {
  res.json({
    message: 'Hello from a private endpoint! You need to be authenticated and have a scope of read:messages to see this.'
  });
});
```

この構成では、`read:messages` スコープを持つアクセストークンだけがエンドポイントにアクセスできます。

<Info>
  ##### 次にできること

  <table>
    <tr>
      <td><a href="/docs/ja-JP/authenticate/identity-providers">他のアイデンティティ プロバイダーを設定する</a></td>
      <td><a href="/docs/ja-JP/secure/multi-factor-authentication">多要素認証を有効化する</a></td>
    </tr>

    <tr>
      <td><a href="/docs/ja-JP/secure/attack-protection">攻撃保護について学ぶ</a></td>
      <td><a href="/docs/ja-JP/customize/rules">Rules について学ぶ</a></td>
    </tr>
  </table>

  [GitHub で編集](https://github.com/auth0/docs/edit/master/articles/quickstart/backend/aspnet-core-webapi/01-authorization.md)
</Info>

***
