Docs Menu
Docs Home
/ /
Atlas App Services
/

カスタム HTTPSHTTPS endpoints エンドポイント [非推奨]

項目一覧

  • エンドポイントの構造
  • ベース URL
  • エンドポイント ルート
  • HTTP メソッド
  • カスタム HTTPS エンドポイントの作成
  • 認証
  • 承認
  • エンドポイント関数の記述
  • リクエストデータへのアクセス
  • HTTPS 応答の返信
  • カスタム エンドポイントの呼び出し
  • 応答データ形式の選択
  • リクエストの認証
  • リクエストの許可

カスタム HTTPS endpoints を定義して、外部サービスと統合するアプリ固有の API ルートまたは Webhook を作成できます。カスタム エンドポイントは、ユーザーが記述したサーバーレス関数を使用して、特定の URL と HTTP メソッドの受信リクエストを取り扱います。

注意

カスタム HTTPS エンドポイントは、プライベート エンドポイントではサポートされません。

エンドポイントは標準の暗号化された HTTPS requests を使用するため、エンドポイントを呼び出すためにデータベース ドライバーや特別なライブラリをインストールする必要はありません。代わりに、任意の HTTP クライアントから次のようなリクエストを送信します。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{
"name": "Casey"
}'

エンドポイントは、特定の URL に送信された 1 つ以上の HTTP メソッドを処理します。

アプリ内のエンドポイントはベース URL を共有します。URL は、あなたのアプリ ID を使用してアプリを一意に指します。

グローバルにデプロイされたアプリは、次の形式を使用します。

エンドポイント ベース URL(グローバルアプリ):
https://data.mongodb-api.com/app/<App ID>/endpoint

ローカルにデプロイされたアプリのエンドポイントは、アプリのデプロイリージョンに固有のベースURLを使用します(例: us-east-1

エンドポイントベース URL(ローカルアプリ)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint

すべての HTTPS エンドポイントには、エンドポイントの名前として機能するルートがあります。エンドポイントのルートは任意であり、アプリに固有です。ただし、エンドポイント URL パスに表示されるため、ルートが実行するアクションを表す必要があります。

ルート名はフォワードスラッシュ(/)で始める必要があり、ネストされたパスを示すためにフォワードスラッシュを追加してもかまいません。

エンドポイント ルート
/my/nested/route

エンドポイントを呼び出すには、そのルートをアプリのベース URL に追加して HTTP リクエストを送信します。

An endpoint URL
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route

アプリ内の各エンドポイントは 1 つ以上の HTTP メソッド を処理します (特定のルートの場合)。たとえば、新しいリソースを作成するためのPOSTリクエストと、既存のリソースを一覧表示するためのGETリクエストを受け入れるルートが 1 つあるとします。

同じルートを提供するけれども異なるリクエスト メソッドを取り扱う、複数のカスタム エンドポイントを定義できます。あるいは、すべてのメソッドを取り扱うルートの単一のエンドポイントを定義することもできます。

カスタム エンドポイントは、次の標準 HTTP メソッドをサポートします。

  • GET

  • POST

  • PUT

  • PATCH

  • DELETE

アプリのデータ API は、Atlas App Services UIから、または、App Services CLI を使用して構成ファイルを配置することによって設定できます。

  1. 左側のナビゲーション メニューで HTTPS Endpoints をクリックし、次に Add An Endpoint をクリックします。

  2. エンドポイント Route を定義します。ルート名はフォワードスラッシュ(/)で始まる必要があり、ネストされたパスを示すためにフォワードスラッシュを追加してもかまいません。

  3. ドロップダウンからエンドポイントの HTTP メソッドを選択します。特定の方法(GETPOST など)を選択することも、エンドポイントが任意の HTTP メソッドを受け入れるように設定することもできます(つまり ANY)。

  4. JSON または EJSON のいずれかの応答タイプを選択します。Respond With Result を有効にすると、エンドポイント関数の戻り値を応答のボディとして自動的に含めることができます。

  5. エンドポイントのリクエストを処理するエンドポイント関数を記述します。 または、既存の関数を名前で指定します。

  6. セキュリティを強化するために、リクエスト承認を設定できます。

  7. データ API 構成を保存します。

  8. リクエストがデータを安全に読み書きできるようにアクセス権限を設定します。

  9. アプリを保存して配置します。

  1. アプリの最新バージョンを取得します。

    appservices pull --remote="<Your App ID>"
  2. カスタムエンドポイントの構成オブジェクトを定義します。

    http_endpoints/config.json
    [
    {
    "route": "<Endpoint route name>",
    "http_method": "<HTTP method>",
    "function_name": "<Endpoint function name",
    "validation_method": "<Authorization scheme>",
    "respond_result": <boolean>,
    "fetch_custom_user_data": <boolean>,
    "create_user_on_auth": <boolean>,
    "disabled": <boolean>
    }
    ]
  3. 1 つ以上のコレクションのルールを定義します。

    data_sources/mongodb-atlas/<db>/<collection>/rules.json
    {
    "database": "<Database Name>",
    "collection": "<Collection Name>",
    "roles": [<Role>],
    "filters": [<Filter>]
    }
  4. アプリをデプロイします。

    appservices push

カスタム エンドポイントは特定のユーザーのコンテキストで実行されるため、アプリはリクエストごとにルールを適用し、ドキュメント スキーマを検証できます。

デフォルトでは、エンドポイントはアプリケーション認証を使用します。アプリケーション認証では、各リクエストに API キーや JWT などのアプリケーション ユーザーの認証情報を含める必要があります。アプリケーションのニーズに合わせて、他のカスタム認証スキームを構成することもできます。

リクエストを認証する方法の例については、「 データ API リクエストの認証」を参照してください。

アプリケーション認証では、ユーザーはアプリに対して有効にした認証プロバイダーを使用してログインする必要があります。リクエストには、認証プロバイダーから付与されたアクセストークンか、ユーザーがログインする際の認証情報を含められます(例: API キー、メールとパスワードなど)。

ユーザー ID 認証では、すべてのリクエストが事前選択済みの、単一のアプリケーション ユーザーとして実行されます。これは、エンドポイントを呼び出したユーザーに関係なく、すべてのリクエストに同じ権限を付与する必要がある場合に有用です。

ユーザーを選択するには、エンドポイント構成でユーザー アカウント ID を指定します。

functions/config.json
[
{
...,
"run_as_user_id": "628e47baf4c2ac2796fc8a91"
}
]

スクリプト認証は、リクエストがどのアプリケーション ユーザーの権限で実行されるかを決定するために関数を呼び出します。また、カスタム認証と認証スキームの実装に使用できます。

MongoDB CRUD および集計 API への完全なアクセス権を持ち、一切のルール、ロール、または制限のある権限の影響を受けないシステムユーザーとしてリクエストを実行するには、関数により、既存のアプリケーション ユーザーのアカウント ID が文字列または { "runAsSystem": true } として返される必要があります。

関数を定義するには、エンドポイント設定でソースコードを指定します。

functions/config.json
[
{
...,
"run_as_user_id_script_source": "exports = () => {return \"628e47baf4c2ac2796fc8a91\"}"
}
]

システム認証では、資格情報を必要とせず、MongoDB CRUD および Aggregation API へのフルアクセス権を持ち、ルール、ロール、または制限された権限の対象とならないシステムユーザーとしてエンドポイントを実行するように構成します。

functions/config.json
[
{
...,
"run_as_system": true
}
]

Tip

UI で作成する新しいエンドポイントは、デフォルトでシステム認証を使用します。

エンドポイントは、認証されたユーザーに対して、リクエストの中で追加の承認情報を提供することを要求できます。エンドポイント機能を設定することで、各カスタム エンドポイントの承認スキームを定義します。

エンドポイントは、リクエストが承認されたことを証明するために、kubernetes secret string を使用する一連の組み込み承認スキームをネイティブでサポートしています。また、組み込みスキームと一緒に、または組み込みスキームの代わりに使用できるカスタム承認スキームを定義することもできます。

特定の関数の認証を設定する方法については、「関数の定義」を参照してください。

エンドポイントは以下の組み込みの承認スキームをサポートしています。

認証済みの全ユーザーにはエンドポイントを呼び出す権限が与えられます。認証済みリクエストには、承認情報を含める必要はありません。

認証済みユーザーは、クエリ パラメーターの値として特定の文字列 secret を含めることによって、エンドポイントを呼び出す権限があることを証明する必要があります。

文字列をシークレット内で定義し、エンドポイントの構成でシークレットを名前で参照します。

http_endpoints/config.json
[
{
...,
"verification_method": "SECRET_AS_QUERY_PARAM",
"secret_name": "secret_verification_string"
}
]

リクエストにシークレットを含める方法については、「リクエストの認証」を参照してください。

認証済みユーザーは、リクエスト本文と秘密の string から生成された 16 進数でエンコードされた HMAC SHA- 256ハッシュを含むEndpoint-Signatureヘッダーを含めることで、エンドポイントを呼び出す権限があることを証明する必要があります。

文字列をシークレット内で定義し、エンドポイントの構成でシークレットを名前で参照します。

リクエストに署名する方法については、「リクエストの承認」を参照してください。

受信した認証済みリクエストの実行を許可するかどうかを判断するためのカスタム承認を定義できます。式はリクエストごとに評価され、リクエストを許可するには true に評価する必要があります。式が false と評価された場合、リクエストは承認されず、エラーとなります。承認に失敗したリクエストは、お客様のアプリの請求使用量にはカウントされません。

承認式では、%%user などの変数を使用して、呼び出し元のユーザーに基づいて認証したり、 %%request のような変数を使用して、各受信リクエストの詳細に基づいて決定を下したりできます。

カスタム承認スキームを定義するには、エンドポイント関数の設定で式を指定します。

http_endpoints/config.json
[
{
...,
"can_evaluate": {
"%%request.requestHeaders.x-secret-key": "my-secret"
}
}
]

すべてのカスタムエンドポイントは、エンドポイントが受信リクエストを受け取るたびに実行される関数に関連付けられています。この関数では、npm からライブラリーをインポートしたり、リンクされた MongoDB Atlas クラスターに接続したり、他のサーバーレス関数を呼び出したりできます。

Atlas App Services の UI でエンドポイントを作成時に新しい関数を定義するには、[Function] セクションに移動し、ドロップダウンから [+ New Function] を選択します。

ワークフローに応じて、エンドポイント ハンドラー関数を定義および編集することもできます。

エンドポイント関数は常に 2 つの引数を受け取ります。

  • Request オブジェクト: 受信リクエストのヘッダー、クエリ パラメータ、ボディ データにアクセスできます。

  • Response オブジェクト: 呼び出し元に返される HTTPS 応答を構成できます。

サンプル関数と、リクエストおよびレスポンスの例については、「」を参照してください。

カスタムエンドポイント Request オブジェクトは、エンドポイントを呼び出した HTTP リクエストを表します。受信リクエストのヘッダー、クエリ パラメーター、ボディ データにアクセスできます。

エンドポイント リクエスト オブジェクト
{
"headers": { "<Header>": ["<Header Value>"] },
"query": { "<Query Parameter>": "<Parameter Value>" },
"body": <BSON.Binary>
}
フィールド
説明
query

各フィールドが URL クエリ パラメータをその値にマッピングするオブジェクト。クエリ文字列 内でキーが複数回使用されている場合、このオブジェクトでは最初の出現のみが表されます。完全なクエリ文字列を操作するには、 context.request.rawQueryString を使用します。

次の query オブジェクトはクエリ文字列 ?regions=na,eu&currency=USD を表します。

{
"regions": "na&eu",
"currency": "USD"
}
headers

各フィールドがリクエスト ヘッダー名を 1 つ以上の値の配列にマッピングするオブジェクト。

{
"Content-Type": ["application/json"],
"Accept": ["application/json"],
"X-CustomHeader": ["some-value", "some-other-value"]
}
body

リクエスト本体を含む BSON.Binary オブジェクト。リクエストに本体が含まれていない場合、この値は undefined になります。

リクエスト本体のデータにアクセスするには、バイナリをシリアル化する必要があります。

// Convert the request body to a JSON string
const serialized = request.body.text();
// Parse the string into a usable object
const body = JSON.parse(serialized);

カスタム エンドポイント Response オブジェクトを使用すると、呼び出し元に返される HTTPS 応答を構成できます。ステータス コードを設定したり、ヘッダーをカスタマイズしたり、応答本体にデータを含めたりできます。

方式
説明
setStatusCode(code)
- code: number

HTTP 応答ステータス コードを設定します。

response.setStatusCode(201);
setBody(body)
- body: string | BSON.Binary

HTTP レスポンス本体を設定します。

body が文字列の場合、エンドポイントはそれを自動的に BSON.Binary としてエンコードします。

response.setBody(
"{'message': 'Hello, World!'}"
);
setHeader(name, value)
- name: string
- value: string

nameで指定されたHTTP レスポンスヘッダーvalue引数で渡された値に設定します。これにより、そのヘッダーにすでに割り当てられている他の値はすべて上書きされます。

response.setHeader(
"Content-Type",
"application/json"
);
addHeader(name, value)
- name: string
- value: string

HTTP レスポンス ヘッダー の設定 nameによって指定された値value 引数で渡された値)。setHeaderとは異なり、これはヘッダーにすでに割り当てられている他の値を上書きしない。

response.addHeader(
"Cache-Control",
"max-age=600"
);
response.addHeader(
"Cache-Control",
"min-fresh=60"
)

受信した POST リクエストの本体を解析し、解析された本体を MongoDB コレクションに格納し、呼び出し元に応答するエンドポイント関数を考えてみましょう。

exports = async function MyCustomEndpoint(request, response) {
try {
// 1. Parse data from the incoming request
if (request.body === undefined) {
throw new Error(`Request body was not defined.`);
}
const body = JSON.parse(request.body.text());
// 2. Handle the request
const { insertedId } = await context.services
.get("mongodb-atlas")
.db("myDb")
.collection("myCollection")
.insertOne({ date: new Date(), requestBody: body });
// 3. Configure the response
response.setStatusCode(201);
// tip: You can also use EJSON.stringify instead of JSON.stringify.
response.setBody(
JSON.stringify({
insertedId,
message: "Successfully saved the request body",
})
);
} catch (error) {
response.setStatusCode(400);
response.setBody(error.message);
}
};

この関数は、次の POST リクエストを受け取ります。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/custom" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{
"type": "event",
"date": "2024-01-01T00:00:00.000Z",
"name": "New Year Begins",
"comment": "Happy New Year!"
}'
{
"message": "Successfully saved the request body",
"insertedId": "639a521bbdec9b85ba94014b"
}

関数は受信リクエストの本体が定義されていることを確認した後、解析された本体を新しいドキュメントとして myCollection という名前のコレクションに格納します。結果の出力には、カスタム メッセージと insertedId を含む構成済みの応答が表示されます。

任意の標準 HTTPS クライアントからカスタム エンドポイントを呼び出せます。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{
"name": "Casey"
}'

リクエストを行う際には、HTTP/1.1 以上が必要です。

リクエストに Accept ヘッダーを含めて、レスポンス本文の特定のデータ形式(JSON または EJSON)をリクエストできます。リクエストに有効な Accept ヘッダーが含まれていない場合、レスポンスはエンドポイント構成で指定されたデフォルトのデータ形式を使用します。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \
-X GET \
-H "Accept: application/ejson" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{
"greeting": "Hello, Leafie!",
"date": { "$date": { "$numberLong": "1654589430998" } }
}
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \
-X GET \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{
"greeting": "Hello, Leafie!",
"date": "2022-06-07T08:10:30.998Z"
}

エンドポイントがアプリケーション認証を使用するように設定されている場合は、すべてのリクエストに有効なユーザー アクセス トークンまたはログイン認証情報を含める必要があります。

一般に、アクセストークンを使用したベアラ認証は、認証情報ヘッダーよりもスループットが高く、安全です。可能な場合は、認証情報ヘッダーの代わりにアクセス トークンを使用します。トークンを使用すると、ユーザーを再認証せずに複数のリクエストを実行できます。また、CORS を適用するウェブ ブラウザからリクエストを送信することもできます。

アクセストークンを使用するには、まず、App Services 認証プロバイダを介してユーザーを認証します。次に、App Services から返されたアクセス トークンを取得し、Bearer トークン スキームを使用してリクエストの許可ヘッダーに含めます。 アクセストークンの取得方法と使用方法の詳細については、「Bearer トークン認証」を参照してください。

curl -X GET \
-H 'Authorization: Bearer <AccessToken>' \
-H 'Content-Type: application/json' \
https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello

あるいは、リクエスト ヘッダーにユーザーの有効なログイン資格情報を含めることもできます。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "email: bob@example" \
-H "password: Pa55w0rd!" \
-d '{ "name": "Bob" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{ "name": "Alice" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \
-X POST \
-H "Accept: application/json" \
-H "jwtTokenString: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0LWN1c3RvbS1lbmRwb2ludHMtZWhtenQiLCJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoyMTQ1OTE2ODAwfQ.pIMvnXWrcDvmPzmE33ZPrwkBAFSwy-GxW8sP-qLtYiw" \
-d '{ "name": "Carlos" }'

重要

ユーザー向けクライアントで API キーを使用しない

ブラウザやその他のユーザー向けクライアントアプリケーションから認証する場合は、API キーを使用してログインしないでください。代わりに、ユーザーから提供された認証情報を受け取る別の認証プロバイダを使用します。API キーやその他の機密性の高い認証情報をローカルに保存しないでください。

エンドポイントの構成によっては、リクエストに追加の承認情報を含める必要がある場合があります。

認証済みの全ユーザーにはエンドポイントを呼び出す権限が与えられます。認証済みリクエストには、承認情報を含める必要はありません。

認証済みユーザーは、secret クエリ パラメータの値としてエンドポイントのシークレット文字列を含めることで、エンドポイントを呼び出す権限があることを証明する必要があります。

次の curl リクエストでは、シークレット文字列"Super5ecr3tPa55w0rd" を使用してシークレット クエリ パラメータの検証を行います。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/passwordRequired?secret=Super5ecr3tPa55w0rd" \
-X GET \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-d '{ "data": "VGhpcyBpcyBzb21lIGRhdGEgdGhhdCB3YXMgZW5jb2RlZCBhcyBhIEJhc2U2NCBBU0NJSSBzdHJpbmc=" }'

認証済みユーザーは、リクエスト本文とエンドポイントの秘密の string から生成された 16 進数でエンコードされたHMAC SHA- 256ハッシュを含むEndpoint-Signatureヘッダーを含めることで、エンドポイントを呼び出す権限があることを証明する必要があります。

Endpoint-Signature: sha256=<hex encoded hash>

次の関数を使用して、ペイロード署名を生成できます。

/**
* Generate an HMAC request signature.
* @param {string} secret - The secret validation string, e.g. "12345"
* @param {object} body - The endpoint request body e.g. { "message": "MESSAGE" }
* @returns {string} The HMAC SHA-256 request signature in hex format.
*/
exports = function signEndpointRequest(secret, body) {
const payload = EJSON.stringify(body);
return utils.crypto.hmac(payload, secret, "sha256", "hex");
};

次の curl リクエストには、シークレット値 Super5ecr3tPa55w0rd で署名されたペイロード署名ヘッダーが含まれています。

curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/sendMessage" \
-X POST \
-H "Accept: application/json" \
-H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \
-H "Endpoint-Signature: sha256=d4f0537db4e230d7a6028a6f7c3bb1b57c9d16f39176d78697e559ac333e0b36" \
-d '{ "message": "Hello!" }'

戻る

データAPIエンドポイント [非推奨]