[feat] Flow Tester 사용자 선택 기능 및 API Explorer 인증 공유

- API Explorer와 세션 토큰 공유 (api_explorer_token, api_explorer_user_id)
- 사용자 선택 드롭다운 UI 추가 (동일 테넌트 사용자 목록)
- HMAC 변수 자동 생성 기능 추가 (\$hmac.exp, \$hmac.signature 등)
- VariableBinder에서 선택된 사용자 정보 사용
- 사용자 선택 시 Sanctum 토큰 자동 발급
This commit is contained in:
2025-12-18 16:08:53 +09:00
parent a62337ef5c
commit e013f5205c
4 changed files with 270 additions and 26 deletions

View File

@@ -25,10 +25,12 @@ public function index(): View
->orderByDesc('created_at')
->paginate(20);
// 세션에 저장된 토큰
$savedToken = session('flow_tester_token');
// 세션에 저장된 토큰 (API Explorer와 공유)
$savedToken = session('api_explorer_token');
$selectedUserId = session('api_explorer_user_id');
$selectedUser = $selectedUserId ? \App\Models\User::find($selectedUserId) : null;
return view('dev-tools.flow-tester.index', compact('flows', 'savedToken'));
return view('dev-tools.flow-tester.index', compact('flows', 'savedToken', 'selectedUser'));
}
/**
@@ -335,12 +337,68 @@ public function runDetail(int $runId): View
/*
|--------------------------------------------------------------------------
| Token Management
| Token & User Management (API Explorer와 공유)
|--------------------------------------------------------------------------
*/
/**
* Bearer 토큰 저장
* 현재 테넌트의 사용자 목록
*/
public function users()
{
$tenantId = auth()->user()->tenant_id;
$users = \App\Models\User::where('tenant_id', $tenantId)
->select(['id', 'name', 'email', 'tenant_id'])
->orderBy('name')
->limit(100)
->get();
return response()->json($users);
}
/**
* 사용자 선택 (Sanctum 토큰 발급)
*/
public function selectUser(Request $request)
{
$validated = $request->validate([
'user_id' => 'required|integer',
]);
$user = \App\Models\User::find($validated['user_id']);
if (! $user) {
return response()->json([
'success' => false,
'message' => '사용자를 찾을 수 없습니다.',
], 404);
}
// Sanctum 토큰 발급
$token = $user->createToken('flow-tester', ['*'])->plainTextToken;
// 세션에 저장 (API Explorer와 공유)
session([
'api_explorer_token' => $token,
'api_explorer_user_id' => $user->id,
]);
return response()->json([
'success' => true,
'message' => "'{$user->name}' 사용자로 인증되었습니다.",
'user' => [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'tenant_id' => $user->tenant_id,
],
'token_preview' => substr($token, 0, 20).'...',
]);
}
/**
* Bearer 토큰 저장 (직접 입력)
*/
public function saveToken(Request $request)
{
@@ -348,7 +406,11 @@ public function saveToken(Request $request)
'token' => 'required|string',
]);
session(['flow_tester_token' => $validated['token']]);
// API Explorer와 같은 세션 키 사용
session([
'api_explorer_token' => $validated['token'],
'api_explorer_user_id' => null, // 직접 입력 시 사용자 정보 없음
]);
return response()->json([
'success' => true,
@@ -361,11 +423,11 @@ public function saveToken(Request $request)
*/
public function clearToken()
{
session()->forget('flow_tester_token');
session()->forget(['api_explorer_token', 'api_explorer_user_id']);
return response()->json([
'success' => true,
'message' => '토큰이 초기화되었습니다.',
'message' => '인증이 초기화되었습니다.',
]);
}
@@ -374,11 +436,19 @@ public function clearToken()
*/
public function tokenStatus()
{
$token = session('flow_tester_token');
$token = session('api_explorer_token');
$userId = session('api_explorer_user_id');
$user = $userId ? \App\Models\User::find($userId) : null;
return response()->json([
'has_token' => ! empty($token),
'token_preview' => $token ? substr($token, 0, 20).'...' : null,
'user' => $user ? [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'tenant_id' => $user->tenant_id,
] : null,
]);
}
}