File size: 1,504 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { NextResponse } from "next/server";
import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
import { extractBearer, ACCESS_TOKEN_PREFIX } from "@/server/authz/accessTokenAuth";
import { verifyAccessToken, getAccessToken } from "@/lib/db/accessTokens";

/**
 * GET /api/cli/whoami — report the current credential to the CLI.
 *
 * Requires a valid management credential (read scope is enough — it's a GET).
 * When the caller used a scoped CLI access token, returns its name/scope/expiry
 * so `omniroute connect --key` / `context current` can confirm what they hold.
 * Other credentials (dashboard session, manage-scope API key, loopback CLI
 * token) report `viaAccessToken: false`.
 */
export async function GET(request: Request) {
  const authError = await requireManagementAuth(request);
  if (authError) return authError;

  const bearer = extractBearer(request);
  if (bearer && bearer.startsWith(ACCESS_TOKEN_PREFIX)) {
    const verified = verifyAccessToken(bearer);
    if (verified) {
      const record = getAccessToken(verified.id);
      return NextResponse.json({
        authenticated: true,
        viaAccessToken: true,
        id: verified.id,
        name: verified.name,
        scope: verified.scope,
        createdAt: record?.createdAt ?? null,
        lastUsedAt: record?.lastUsedAt ?? null,
        expiresAt: record?.expiresAt ?? null,
      });
    }
  }

  return NextResponse.json({ authenticated: true, viaAccessToken: false, scope: null });
}