カスタム HTTPSHTTPS endpoints エンドポイント [非推奨]
項目一覧
カスタム 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 を共有します。URL は、あなたのアプリ ID を使用してアプリを一意に指します。
グローバルにデプロイされたアプリは、次の形式を使用します。
https://data.mongodb-api.com/app/<App ID>/endpoint
ローカルにデプロイされたアプリのエンドポイントは、アプリのデプロイリージョンに固有のベースURLを使用します(例: us-east-1
)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint
エンドポイント ルート
すべての HTTPS エンドポイントには、エンドポイントの名前として機能するルートがあります。エンドポイントのルートは任意であり、アプリに固有です。ただし、エンドポイント URL パスに表示されるため、ルートが実行するアクションを表す必要があります。
ルート名はフォワードスラッシュ(/
)で始める必要があり、ネストされたパスを示すためにフォワードスラッシュを追加してもかまいません。
/my/nested/route
エンドポイントを呼び出すには、そのルートをアプリのベース URL に追加して HTTP リクエストを送信します。
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route
HTTP メソッド
アプリ内の各エンドポイントは 1 つ以上の HTTP メソッド を処理します (特定のルートの場合)。たとえば、新しいリソースを作成するためのPOST
リクエストと、既存のリソースを一覧表示するためのGET
リクエストを受け入れるルートが 1 つあるとします。
同じルートを提供するけれども異なるリクエスト メソッドを取り扱う、複数のカスタム エンドポイントを定義できます。あるいは、すべてのメソッドを取り扱うルートの単一のエンドポイントを定義することもできます。
カスタム エンドポイントは、次の標準 HTTP メソッドをサポートします。
カスタム HTTPS エンドポイントの作成
アプリのデータ API は、Atlas App Services UIから、または、App Services CLI を使用して構成ファイルを配置することによって設定できます。
左側のナビゲーション メニューで HTTPS Endpoints をクリックし、次に Add An Endpoint をクリックします。
エンドポイント Route を定義します。ルート名はフォワードスラッシュ(
/
)で始まる必要があり、ネストされたパスを示すためにフォワードスラッシュを追加してもかまいません。ドロップダウンからエンドポイントの HTTP メソッドを選択します。特定の方法(
GET
やPOST
など)を選択することも、エンドポイントが任意の HTTP メソッドを受け入れるように設定することもできます(つまりANY
)。JSON または EJSON のいずれかの応答タイプを選択します。Respond With Result を有効にすると、エンドポイント関数の戻り値を応答のボディとして自動的に含めることができます。
エンドポイントのリクエストを処理するエンドポイント関数を記述します。 または、既存の関数を名前で指定します。
セキュリティを強化するために、リクエスト承認を設定できます。
データ API 構成を保存します。
リクエストがデータを安全に読み書きできるようにアクセス権限を設定します。
アプリを保存して配置します。
アプリの最新バージョンを取得します。
appservices pull --remote="<Your App ID>" カスタムエンドポイントの構成オブジェクトを定義します。
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> } ] 1 つ以上のコレクションのルールを定義します。
data_sources/mongodb-atlas/<db>/<collection>/rules.json{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [<Role>], "filters": [<Filter>] } アプリをデプロイします。
appservices push
認証
カスタム エンドポイントは特定のユーザーのコンテキストで実行されるため、アプリはリクエストごとにルールを適用し、ドキュメント スキーマを検証できます。
デフォルトでは、エンドポイントはアプリケーション認証を使用します。アプリケーション認証では、各リクエストに API キーや JWT などのアプリケーション ユーザーの認証情報を含める必要があります。アプリケーションのニーズに合わせて、他のカスタム認証スキームを構成することもできます。
リクエストを認証する方法の例については、「 データ API リクエストの認証」を参照してください。
アプリケーション認証では、ユーザーはアプリに対して有効にした認証プロバイダーを使用してログインする必要があります。リクエストには、認証プロバイダーから付与されたアクセストークンか、ユーザーがログインする際の認証情報を含められます(例: API キー、メールとパスワードなど)。
ユーザー ID 認証では、すべてのリクエストが事前選択済みの、単一のアプリケーション ユーザーとして実行されます。これは、エンドポイントを呼び出したユーザーに関係なく、すべてのリクエストに同じ権限を付与する必要がある場合に有用です。
ユーザーを選択するには、エンドポイント構成でユーザー アカウント ID を指定します。
[ { ..., "run_as_user_id": "628e47baf4c2ac2796fc8a91" } ]
スクリプト認証は、リクエストがどのアプリケーション ユーザーの権限で実行されるかを決定するために関数を呼び出します。また、カスタム認証と認証スキームの実装に使用できます。
MongoDB CRUD および集計 API への完全なアクセス権を持ち、一切のルール、ロール、または制限のある権限の影響を受けないシステムユーザーとしてリクエストを実行するには、関数により、既存のアプリケーション ユーザーのアカウント ID が文字列または { "runAsSystem": true }
として返される必要があります。
関数を定義するには、エンドポイント設定でソースコードを指定します。
[ { ..., "run_as_user_id_script_source": "exports = () => {return \"628e47baf4c2ac2796fc8a91\"}" } ]
システム認証では、資格情報を必要とせず、MongoDB CRUD および Aggregation API へのフルアクセス権を持ち、ルール、ロール、または制限された権限の対象とならないシステムユーザーとしてエンドポイントを実行するように構成します。
[ { ..., "run_as_system": true } ]
Tip
UI で作成する新しいエンドポイントは、デフォルトでシステム認証を使用します。
承認
エンドポイントは、認証されたユーザーに対して、リクエストの中で追加の承認情報を提供することを要求できます。エンドポイント機能を設定することで、各カスタム エンドポイントの承認スキームを定義します。
エンドポイントは、リクエストが承認されたことを証明するために、kubernetes secret string を使用する一連の組み込み承認スキームをネイティブでサポートしています。また、組み込みスキームと一緒に、または組み込みスキームの代わりに使用できるカスタム承認スキームを定義することもできます。
特定の関数の認証を設定する方法については、「関数の定義」を参照してください。
組み込みの承認スキーム
エンドポイントは以下の組み込みの承認スキームをサポートしています。
認証済みの全ユーザーにはエンドポイントを呼び出す権限が与えられます。認証済みリクエストには、承認情報を含める必要はありません。
カスタム承認スキーム
受信した認証済みリクエストの実行を許可するかどうかを判断するためのカスタム承認式を定義できます。式はリクエストごとに評価され、リクエストを許可するには true
に評価する必要があります。式が false
と評価された場合、リクエストは承認されず、エラーとなります。承認に失敗したリクエストは、お客様のアプリの請求使用量にはカウントされません。
承認式では、%%user
などの変数を使用して、呼び出し元のユーザーに基づいて認証したり、 %%request
のような変数を使用して、各受信リクエストの詳細に基づいて決定を下したりできます。
カスタム承認スキームを定義するには、エンドポイント関数の設定で式を指定します。
[ { ..., "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 を使用します。 例次の
| |||||
headers | 各フィールドがリクエスト ヘッダー名を 1 つ以上の値の配列にマッピングするオブジェクト。 例
| |||||
body | リクエスト本体を含む BSON.Binary オブジェクト。リクエストに本体が含まれていない場合、この値は リクエスト本体のデータにアクセスするには、バイナリをシリアル化する必要があります。
|
HTTPS 応答の返信
カスタム エンドポイント Response
オブジェクトを使用すると、呼び出し元に返される HTTPS 応答を構成できます。ステータス コードを設定したり、ヘッダーをカスタマイズしたり、応答本体にデータを含めたりできます。
方式 | 説明 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
setStatusCode(code) - code: number | HTTP 応答ステータス コードを設定します。 例
| |||||||||
setBody(body) - body: string | BSON.Binary | HTTP レスポンス本体を設定します。
例
| |||||||||
setHeader(name, value) - name: string - value: string |
例
| |||||||||
addHeader(name, value) - name: string - value: string | HTTP レスポンス ヘッダー の設定 例
|
例
受信した 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!" }'