APIキーやデータベース認証情報などの環境変数は、.env
ファイルに追加でき、アプリケーションで使用可能になります。
.env.local
または.env.[mode]
ファイルも使用できます。詳細はViteのドキュメントを参照してください。機密情報を含むファイルはすべて.gitignore
ファイルに追加してください!
process.env
内の環境変数は、$env/static/private
からも利用可能です。
この演習では、正しいパスフレーズを知っていれば、ユーザーがウェブサイトにアクセスできるようにしたいと考えています。環境変数を使用します。
まず、.env
に新しい環境変数を追加します。
PASSPHRASE="open sesame"
src/routes/+page.server.js
を開きます。$env/static/private
からPASSPHRASE
をインポートし、フォームアクション内で使用します。
import { redirect, fail } from '@sveltejs/kit';
import { PASSPHRASE } from '$env/static/private';
export function load({ cookies }) {
if (cookies.get('allowed')) {
redirect(307, '/welcome');
}
}
export const actions = {
default: async ({ request, cookies }) => {
const data = await request.formData();
if (data.get('passphrase') === PASSPHRASE) {
cookies.set('allowed', 'true', {
path: '/'
});
redirect(303, '/welcome');
}
return fail(403, {
incorrect: true
});
}
};
これで、正しいパスフレーズを知っている人なら誰でもウェブサイトにアクセスできるようになりました。
秘密の保持
機密データが誤ってブラウザに送信され、ハッカーや悪意のある者によって簡単に盗まれる可能性があるのを防ぐことが重要です。
SvelteKitは、これを簡単に防ぐことができます。PASSPHRASE
をsrc/routes/+page.svelte
にインポートしようとするとどうなるか見てみましょう。
<script>
import { PASSPHRASE } from '$env/static/private';
let { form } = $props();
</script>
エラーオーバーレイが表示され、$env/static/private
はクライアントサイドコードにインポートできないことが示されます。サーバーモジュールでのみインポートできます。
+page.server.js
+layout.server.js
+server.js
.server.js
で終わるモジュールsrc/lib/server
内のモジュール
これらのモジュールは、他のサーバーモジュールからのみインポートできます。
静的と動的
$env/static/private
のstatic
は、これらの値がビルド時に既知であり、静的に置き換えられることを示しています。これにより、便利な最適化が可能になります。
import { FEATURE_FLAG_X } from '$env/static/private';
if (FEATURE_FLAG_X === 'enabled') {
// code in here will be removed from the build output
// if FEATURE_FLAG_X is not enabled
}
場合によっては、動的な環境変数、つまりアプリを実行するまでわからない環境変数を参照する必要があるかもしれません。このケースについては、次の演習で説明します。
<script>
let { form } = $props();
</script>
<form method="POST">
<label>
enter the passphrase
<input name="passphrase" autocomplete="off" />
</label>
</form>
{#if form?.incorrect}
<p class="error">wrong passphrase!</p>
{/if}
<style>
.error {
color: red;
}
</style>