BoxPistols / BoxPistols/map-auto-waypoint

Basic認証

Open
#19 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
1
Forks
0
PR merge metrics
No merged PRs in 30d

Description

期間、1day-1week-2weekくらい?

## 調査:クライアントサイド疑似認証の実装方針

sdpf-theme での実装パターンを踏襲しつつ、このプロジェクト(Vite + React)に適用する方法を整理します。

1. コンポーネント構成:
* AuthGuard (または LoginGate)
コンポーネントを作成し、アプリ全体(または特定ルート)をラップする。
* ローカルストレージ (localStorage) や セッションストレージ (sessionStorage) に認証状態を保存。

2. 認証ロジック:
* 初回アクセス時: パスワード入力画面を表示。
* 入力されたパスワードと、環境変数(VITE_APP_PASSWORD
等)またはハードコードされたハッシュ値を比較。
* 一致: ストレージにフラグを立て、本来のコンテンツ(children)をレンダリング。
* 不一致: エラーメッセージを表示。

3. Storybookへの適用:
* Storybookは独立したアプリとしてビルドされるため、メインアプリの AuthGuard
とは別に、Storybook用のデコレーター(preview.tsx で設定)として認証画面を挟む必要があります。
* あるいは、Storybook自体は見せても良いが、中の特定の機密コンポーネントだけ隠す、というよりは「St
orybook全体へのアクセス制限」が目的かと思いますので、preview.tsx
で全ストーリーをラップするのが確実です。

提案する実装ステップ

コードは書かずに調査のみという指示ですので、以下の手順が可能であることを報告します。

1. 環境変数の準備: .env にパスワードを設定(ビルド時に埋め込まれるため、真の機密性はなし)。
2. `AuthGate` コンポーネントの作成:
* パスワード入力フォームを持つ単純なReactコンポーネント。
* src/components/AuthGate/AuthGate.jsx
3. アプリへの適用:
* src/App.jsx の最上位で を使用。
4. Storybookへの適用:
* .storybook/preview.tsx の decorators
に認証ロジックを追加し、認証未済の場合はストーリーの代わりにログイン画面を表示する。

---

# Issue #19 詳細定義: クライアントサイド簡易認証(擬似ログイン)の実装

GitHub
Pages等の静的ホスティング環境において、簡易的なアクセス制限(Basic認証相当)を実現するための実装方針で
す。
サーバーサイド認証が利用できないため、Reactコンポーネントによる「擬似的なログインゲート」を実装します

1. 目的とスコープ
* 目的: 関係者以外からの閲覧を簡易的に防ぐ(URLを知っていてもパスワードが必要)。
* 対象: アプリケーション全体、および Storybook。
* セキュリティレベル:
低。パスワードはビルド後のJSに含まれるか、環境変数として埋め込まれるため、技術的な知識があれば突破
可能です。「鍵のかかっていないドアに『立入禁止』の札を下げる」程度の効果と想定してください。

2. 実装方針

##### A. 認証コンポーネント (AuthGate)
アプリケーションのコンテンツを表示する前に、パスワード入力を要求するラッパーコンポーネントを作成します

* 機能:
* sessionStorage を確認し、認証済みフラグがあれば子要素 (children) を表示。
* 未認証の場合はパスワード入力フォームを表示。
* パスワードが一致したら sessionStorage にフラグを保存し、リロードなしでコンテンツを表示。
* パスワード管理:
* 環境変数 VITE_BASIC_AUTH_PASSWORD で設定。
* 未設定の場合は認証をスキップ(開発環境の利便性のため)。

##### B. メインアプリへの適用 (src/App.jsx)
App コンポーネントの最上位、あるいは MainLayout をラップする形で AuthGate を配置します。

1 // イメージ
2 function App() {
3 return (
4
5
6 {/* ... アプリ本体 ... */}
7
8
9 );
10 }

##### C. Storybookへの適用 (.storybook/preview.tsx)
Storybook全体を保護するため、グローバルデコレーターとして認証ロジックを注入します。

1 // .storybook/preview.tsx イメージ
2 const withAuth = (Story) => {
3 const [isAuthenticated, setIsAuthenticated] = useState(false);
4
5 // ... 認証ロジック ...
6
7 if (!isAuthenticated) return setIsAuthenticated(true)} />;
8 return ;
9 };
10
11 export const decorators = [withAuth];

3. タスクリスト

- [ ] 環境変数 VITE_BASIC_AUTH_PASSWORD の定義と .env 設定
- [ ] src/components/AuthGate/ コンポーネントの実装
- [ ] UI: パスワード入力フィールド、送信ボタン
- [ ] Logic: 入力値検証、セッションストレージ管理
- [ ] src/App.jsx への AuthGate 導入
- [ ] .storybook/preview.tsx への認証デコレーター導入
- [ ] ビルドと動作確認(認証なし/あり の切り替え確認)

4. 注意点
* セキュリティ:
本格的な機密情報の保護には使用しないでください(APIキーや個人情報などがソースコードに含まれる場合、
この認証では守れません)。
* UX:
ページをリロードしたりタブを閉じたりすると、セッションストレージがクリアされ、再ログインが必要にな
る場合があります(localStorage
に変更すれば永続化可能ですが、セキュリティリスクは高まります)。今回は
sessionStorage(タブを閉じるまで有効)を推奨します。

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reading src/App.jsx, .storybook/preview.tsx, and the existing component structure to confirm where application and Storybook content are mounted. Then inspect the proposed src/components/AuthGate/AuthGate.jsx entry point and the VITE_BASIC_AUTH_PASSWORD configuration. Done means both targets consistently gate content, sessionStorage behavior works, and authenticated and unauthenticated builds are verified.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, react, storybook, vite
Domain
authentication, frontend, web-dev
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.