Files
hr-portal/TEST-KEYCLOAK-LOGIN.md
Porsche Chen 360533393f feat: HR Portal - Complete Multi-Tenant System with Redis Session Storage
Major Features:
-  Multi-tenant architecture (tenant isolation)
-  Employee CRUD with lifecycle management (onboarding/offboarding)
-  Department tree structure with email domain management
-  Company info management (single-record editing)
-  System functions CRUD (permission management)
-  Email account management (multi-account per employee)
-  Keycloak SSO integration (auth.lab.taipei)
-  Redis session storage (10.1.0.254:6379)
  - Solves Cookie 4KB limitation
  - Cross-system session sharing
  - Sliding expiration (8 hours)
  - Automatic token refresh

Technical Stack:
Backend:
- FastAPI + SQLAlchemy
- PostgreSQL 16 (10.1.0.20:5433)
- Keycloak Admin API integration
- Docker Mailserver integration (SSH)
- Alembic migrations

Frontend:
- Next.js 14 (App Router)
- NextAuth 4 with Keycloak Provider
- Redis session storage (ioredis)
- Tailwind CSS

Infrastructure:
- Redis 7 (10.1.0.254:6379) - Session + Cache
- Keycloak 26.1.0 (auth.lab.taipei)
- Docker Mailserver (10.1.0.254)

Architecture Highlights:
- Session管理由 Keycloak + Redis 統一控制
- 支援多系統 (HR/WebMail/Calendar/Drive/Office) 共享 session
- Token 自動刷新,異質服務整合
- 未來可無縫遷移到雲端

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-23 20:12:43 +08:00

207 lines
5.0 KiB
Markdown

# Keycloak 登入測試指南
## 測試前確認
### 1. 開發伺服器運行中
確認前端開發伺服器正在運行:
```bash
cd hr-portal/frontend
npm run dev
```
應該看到:
```
Local: http://localhost:3000/
Network: http://10.1.0.245:3000/
```
### 2. 環境變數正確
確認 `frontend/.env` 檔案內容:
```env
VITE_API_BASE_URL=https://hr-api.ease.taipei
VITE_KEYCLOAK_URL=https://auth.ease.taipei
VITE_KEYCLOAK_REALM=porscheworld
VITE_KEYCLOAK_CLIENT_ID=hr-portal-web
```
### 3. Keycloak 可以連線
瀏覽器開啟:
```
https://auth.ease.taipei/realms/porscheworld/.well-known/openid-configuration
```
應該會看到一大段 JSON 配置資料。
## 測試步驟
### 步驟 1: 開啟應用
1. 瀏覽器開啟: `http://localhost:3000`
2. 應該會看到「HR Portal」登入頁面
3. 畫面應該顯示:
- 標題: "HR Portal"
- 副標題: "企業人資管理系統"
- 按鈕: "使用 SSO 登入"
**如果看到載入中畫面**:
- 正常,表示 Keycloak 正在初始化
- 等待幾秒鐘
**如果看到錯誤訊息**:
- 開啟瀏覽器開發者工具 (F12)
- 切換到 Console 標籤
- 查看錯誤訊息
- 截圖給我看
### 步驟 2: 點擊登入按鈕
1. 點擊「使用 SSO 登入」按鈕
2. 應該會**自動跳轉**到 Keycloak 登入頁面
3. URL 應該變成 `https://auth.ease.taipei/realms/porscheworld/protocol/openid-connect/...`
**如果沒有跳轉**:
- 開啟開發者工具 Console
- 查看是否有 JavaScript 錯誤
- 截圖錯誤訊息
**如果出現 "Invalid redirect_uri" 錯誤**:
- 回到 Keycloak Admin Console
- Clients → hr-portal-web → Settings
- 檢查 Valid Redirect URIs 是否包含:
```
http://localhost:3000/*
```
### 步驟 3: 在 Keycloak 登入
1. 在 Keycloak 登入頁面輸入:
- **Username**: porsche (或你的測試帳號)
- **Password**: (你的密碼)
2. 點擊 **Sign In**
3. 登入成功後,應該會**自動跳轉回** HR Portal
**如果登入失敗**:
- 檢查帳號密碼是否正確
- 確認該使用者在 Keycloak 中存在且已啟用
### 步驟 4: 確認登入成功
登入成功後,你應該看到:
1. **URL 回到**: `http://localhost:3000/` (首頁)
2. **Header 顯示**:
- 左側: HR Portal Logo
- 右側: 你的使用者名稱和 Email
- 登出按鈕
3. **側邊選單**:
- 儀表板
- 員工管理
- 組織架構
4. **主要內容區**:
- 統計卡片 (總員工數、事業部、在職員工、本月新進)
- 快速操作按鈕
### 步驟 5: 測試導航
1. 點擊側邊選單的「員工管理」
2. 應該看到員工列表頁面
3. URL 變成: `http://localhost:3000/employees`
**如果看到空白或錯誤**:
- 開啟開發者工具 Network 標籤
- 查看 API 請求是否成功
- 檢查是否有 401 Unauthorized 錯誤
### 步驟 6: 檢查 API Token
1. 開啟開發者工具 (F12)
2. 切換到 **Network** 標籤
3. 點擊側邊選單的「員工管理」
4. 在 Network 中找到 `employees` 請求
5. 點擊該請求,查看 **Headers**
6. 找到 **Request Headers** 區塊
7. 應該看到:
```
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
```
這表示 Token 已經正確加入到 API 請求中!
### 步驟 7: 測試登出
1. 點擊右上角的「登出」按鈕
2. 應該會彈出確認對話框:「確定要登出嗎?」
3. 點擊「確定」
4. 應該會回到登入頁面
5. LocalStorage 的 token 應該被清除
## 常見問題除錯
### 問題 1: Console 顯示 "Cannot read properties of undefined"
**可能原因**: 缺少必要的檔案
**檢查**:
```bash
cd hr-portal/frontend
ls src/contexts/AuthContext.tsx
ls src/components/ProtectedRoute.tsx
ls src/lib/keycloak.ts
```
如果檔案不存在,請告訴我,我會幫你建立。
### 問題 2: "Invalid redirect_uri" 錯誤
**解決方式**:
1. Keycloak Admin Console
2. Clients → hr-portal-web → Settings
3. Valid Redirect URIs 加入:
```
http://localhost:3000/*
```
4. Save
### 問題 3: CORS Error
**解決方式**:
1. Keycloak Admin Console
2. Clients → hr-portal-web → Settings
3. Web Origins 加入:
```
http://localhost:3000
```
4. Save
### 問題 4: Token 不在 API 請求中
**檢查**:
1. Console 中是否有 Keycloak 錯誤
2. LocalStorage 是否有 `access_token`
- 開發者工具 → Application → Local Storage
- 應該看到 `access_token` 項目
### 問題 5: 401 Unauthorized
**可能原因**:
1. Token 無效
2. 後端 API 無法驗證 Token
**檢查**:
1. 後端是否正確配置 Keycloak 驗證
2. Keycloak Realm 和 Client 設定是否一致
## 成功指標
如果以下都正常,表示整合成功:
- ✅ 點擊登入會跳轉到 Keycloak
- ✅ Keycloak 登入成功後回到應用
- ✅ Header 顯示正確的使用者資訊
- ✅ 可以正常瀏覽各個頁面
- ✅ Network 中的 API 請求包含 Authorization Header
- ✅ 登出功能正常,會清除 Token
## 需要幫助?
如果遇到任何問題:
1. 截圖瀏覽器畫面
2. 截圖開發者工具的 Console (錯誤訊息)
3. 截圖開發者工具的 Network (失敗的請求)
4. 告訴我具體在哪一步出錯
我會協助你排查問題!