Update public browser login session flow

This commit is contained in:
Michel Paulissen 2026-07-04 09:37:17 +02:00
parent afd7456423
commit cec080aa98
4 changed files with 388 additions and 29 deletions

View file

@ -9,7 +9,10 @@ const path = require("path");
const repo = path.resolve(__dirname, "..");
const tmp = path.join(repo, "target", "acceptance", "tmp", "cli-browser-login-flow");
const project = path.join(tmp, "project");
fs.rmSync(tmp, { recursive: true, force: true });
fs.mkdirSync(tmp, { recursive: true });
fs.mkdirSync(project, { recursive: true });
function writeOpener() {
const opener = path.join(tmp, "browser-opener.js");
@ -86,6 +89,7 @@ async function startCoordinator() {
user: request.user,
browser_credential_kind: "BrowserSession",
cli_session_credential_kind: "CliDeviceSession",
expires_at: "2026-07-04T00:00:00Z",
provider_tokens_sent_to_nodes: false,
flow: {
authorization_url: "http://127.0.0.1:1/application/o/authorize/",
@ -115,8 +119,19 @@ async function startCoordinator() {
function runDisasmer(args, env) {
return new Promise((resolve, reject) => {
const child = cp.spawn("cargo", args, {
cwd: repo,
const child = cp.spawn("cargo", [
"run",
"-q",
"--manifest-path",
path.join(repo, "Cargo.toml"),
"-p",
"disasmer-cli",
"--bin",
"disasmer",
"--",
...args,
], {
cwd: project,
env,
stdio: ["ignore", "pipe", "pipe"],
});
@ -157,13 +172,6 @@ function runDisasmer(args, env) {
try {
const stdout = await runDisasmer(
[
"run",
"-q",
"-p",
"disasmer-cli",
"--bin",
"disasmer",
"--",
"login",
"--browser",
"--json",
@ -190,10 +198,45 @@ function runDisasmer(args, env) {
assert.strictEqual(report.plan.coordinator, coordinator.url);
assert.strictEqual(report.boundary.cli_contacted_coordinator, true);
assert.strictEqual(report.boundary.scoped_cli_session_received, true);
assert.strictEqual(report.boundary.local_cli_session_file_written, true);
assert.strictEqual(report.boundary.provider_tokens_persisted_locally, false);
assert.strictEqual(report.boundary.provider_tokens_exposed_to_cli, false);
assert.strictEqual(report.boundary.provider_tokens_sent_to_nodes, false);
assert.strictEqual(report.boundary.coordinator_session_requests, 1);
assert.strictEqual(coordinator.requests.length, 1);
const sessionFile = path.join(project, ".disasmer", "session.json");
assert(fs.existsSync(sessionFile), "browser login should write a local CLI session file");
const sessionText = fs.readFileSync(sessionFile, "utf8");
const session = JSON.parse(sessionText);
assert.strictEqual(session.kind, "human");
assert.strictEqual(session.coordinator, coordinator.url);
assert.strictEqual(session.tenant, "tenant-smoke");
assert.strictEqual(session.project, "project-smoke");
assert.strictEqual(session.user, "user-smoke");
assert.strictEqual(session.cli_session_credential_kind, "CliDeviceSession");
assert.strictEqual(session.token_expiry_posture, "expires_at");
assert.strictEqual(session.expires_at, "2026-07-04T00:00:00Z");
assert.strictEqual(session.provider_tokens_exposed_to_cli, false);
assert.strictEqual(session.provider_tokens_sent_to_nodes, false);
assert.doesNotMatch(
sessionText,
/access_token|refresh_token|id_token|provider-secret|browser-smoke-code|Bearer/
);
const authStatus = JSON.parse(
await runDisasmer(["auth", "status", "--json"], {
...process.env,
})
);
assert.strictEqual(authStatus.active_coordinator, coordinator.url);
assert.strictEqual(authStatus.principal, "user-smoke");
assert.strictEqual(authStatus.tenant, "tenant-smoke");
assert.strictEqual(authStatus.project, "project-smoke");
assert.strictEqual(authStatus.session.kind, "human");
assert.strictEqual(authStatus.session.source, "session_file");
assert.strictEqual(authStatus.session.provider_tokens_exposed_to_cli, false);
assert.strictEqual(authStatus.session.provider_tokens_exposed_to_nodes, false);
} finally {
if (coordinator.requests.length === 0) {
await coordinator.close().catch(() => {});