カスタムデータベースのアクションスクリプトのベストプラクティス

カスタムのデータベース接続タイプにより、Auth0がレガシーのidentity storeとやり取りするために使用するカスタムコードが含まれるアクションスクリプトを構成できます。アクションスクリプトは、事前に定義されたパラメーターのセットを受け付ける、名前が付けられたJavaScript関数です。

Webtaskコンテナー

アクションスクリプトは、約20秒の実行制限で、個々のWebtaskコンテナー内で実行します。関数が実行された後、コンテナーはリサイクルされます。

コンテナーがリサイクルされる時、アクションスクリプトの保留中の操作は終了されます。これにより、エラー条件が返され、globalオブジェクトのリセットの可能性をもたらす場合があります。globalオブジェクトの詳細については、カスタムデータベースのアクションスクリプト環境のベストプラクティスをご覧ください。

非同期関数

Promiseオブジェクトおよびasync functionを含む、JavaScriptの非同期関数はアクションスクリプトでサポートされています。

アクションスクリプト内でノンブロッキング操作を実行するために、非同期関数を使用できますが、これらの操作がWebtaskコンテナーの実行制限を超えないことを確認してください。Webtaskコンテナーがリサイクルされる時、保留中の操作は終了されるため、予期しない動作またはエラーを引き起こすことがあります。

アクションスクリプト内で外部サービスまたはAPIを呼び出す場合は、合理的な時間の後にタイムアウトして、かつ外部サービスもしくはAPIに到達できなかった場合はエラーを返すように関数を設定してください。

Auth0は、アクションスクリプト内でのPromiseオブジェクトおよびasync functionの使用をサポートしています。

Promiseオブジェクト

この例では、promiseチェーンを使用して書かれた、ネットワークからリソースを取得しPromiseオブジェクトを返す、ビルトインのJavaScript fetchメソッドを使用しています。

function login(userNameOrEmail, password, callback) {
	const hashedPassword = hash(password);
	const apiEndpoint = 'https://example.com/api/authenticate';
	const options = {
		method: 'POST',
		body: {
			email: userNameOrEmail,
			password: hashedPassword
		}
	};

	fetch(apiEndpoint, options) 
		.then((response) => {
			if (!response.ok) {
				return callback(new Error(`HTTP error! Status: ${response.status}`));
			}

			return response.json();
		})
		.then((response) => {
			if (response.err) {
				return callback(new Error(`Error authenticating user: ${err}`));
			}

			let profile = {
				email: response.profileData.email,
				username: response.profileData.username
			};

			return callback(null, profile);
		})
		.catch((err) => {
			return callback(new Error(`An error occurred: ${err}`));
		});
  }

Was this helpful?

/

Async function(非同期関数)

この例では、async functionを使用して書かれた、ネットワークからリソースを取得しPromiseオブジェクトを返す、組み込みのJavaScript fetchメソッドを使用しています。

async function login(userNameOrEmail, password, callback) {
	const hashedPassword = hash(password);
	const apiEndpoint = 'https://example.com/api/authenticate';
	const options = {
		method: 'POST',
		body: {
			email: userNameOrEmail,
			password: hashedPassword
		}
	};

	const response = await fetch(apiEndpoint, options);

	if (!response.ok) {
		return callback(new Error(`HTTP error! Status: ${response.status}`));
	}

	const result = response.json();

	if (result.err) {
		return callback(new Error(`Error authenticating user: ${err}`));
	}

	let profile = {
		email: response.profileData.email,
		username: response.profileData.username
	};

	return callback(null, profile);
}

Was this helpful?

/

コールバック関数

callback関数は、アクションスクリプトの操作が完了したことを知らせ、一度だけ呼び出さなければなりません。アクションスクリプトは、できればreturn文を明示的に使用して、callback関数の呼び出し後すぐに完了しなければなりません。

非同期処理

アクションスクリプトが非同期処理を使用する場合は、callback関数は、すべての非同期操作が完了した後に呼び出されなければなりません。

パラメーター

callback関数がパラメーターなしで呼び出された場合は、nullパラメーターが指定されているように実行されます。

Size(サイズ)

アクションスクリプトの実装の合計サイズは、100kBを超えてはなりません。このサイズ制限は、インポートされたnpmモジュールを除外します。npmモジュールの詳細については、カスタムデータベースのアクションスクリプト環境のベストプラクティスをご覧ください。

スクリプトのサイズが大きくなればなるほど、Webtaskプラットフォームが使用するパッケージングおよび転送プロセスに基づいて遅延が増えます。サイズは、システムのパフォーマンスに影響を与えます。

無名関数

アクションスクリプトは無名関数として実装できますが、そうすることをお勧めしていません。無名関数は、アクションスクリプトのデバッグおよび例外的なエラー条件の結果として生成されたコールスタックの解釈を困難にします。無名関数についての詳細は、MDN Web DocsのIIFEをご覧ください。

エラー処理

エラーを説明するメッセージで、Errorオブジェクトをcallback関数に渡します。

return callback(new Error('My custom error message'));

Was this helpful?

/

セキュリティ

データベースインターフェイス vs.API

Auth0とレガシーのidentity store間の通信すべての安全を確保してください。レガシーのidentity storeにまだAPIが実装されていない場合は、そうすることを強くお勧めします。

レガシーのidentity storeにAPIが用意されている場合は、Auth0を通してAPIを登録し、エンドユーザーからのアクセスを制限するためにアクションを作成してください。

レガシーのidentity storeにAPIが用意されておらず、かつ実装することが不可能な場合でも、データベースと直接通信することができます。Auth0からのインバウンドトラフィックを許可するために、必ずファイアウォールの許可リストにAuth0 IPアドレスを追加してください。

IDプロバイダーのトークン

userオブジェクトがaccess_tokenおよびrefresh_tokenプロパティを返した場合、Auth0は、別の種類のユーザー情報とは異なる方法でそれらを処理します。Auth0は、それらをuserオブジェクトのidentitiesプロパティに保存します。

{
    "email": "you@example.com",
    "updated_at": "2019-03-15T15:56:44.577Z",
    "user_id": "auth0|some_unique_id",
    "nickname": "a_nick_name",
    "identities": [ 
        {
            "user_id": "some_unique_id",
            "access_token": "e1b5.................92ba",
            "refresh_token": "a90c.................620b",
            "provider": "auth0", "connection": "custom_db_name",
            "isSocial": false 
        }
  ], 
  "created_at": "2019-03-15T15:56:44.577Z",
  "last_ip": "192.168.1.1",
  "last_login": "2019-03-15T15:56:44.576Z",
  "logins_count": 3
}

Was this helpful?

/

Auth0管理APIでこれらのプロパティのうちのどちらかを取得したい場合は、アクセストークンを要求するときに、read:user_idp_tokensスコープを含めてください。