Loading…
We use a strictly-necessary cookie to keep you signed in. Accept all also allows optional cookies for analytics, our in-app support chat, and marketing (including ad audience cookies and email open tracking). See our Privacy Policy for details. You can change your choice anytime under Settings → Privacy.
An owner can let one of their agents sign in to the owner's AstraSync dashboard and work there with the owner's access — narrowed by the agent's policy. The session is tied to one machine in the organisation's fleet, signs in through the agent's Workforce Guard checkpoint, and waits for the owner's passkey wherever the policy asks.
Dashboard access is off for every agent until you allow it. Because an agent's policy is fixed per version, you turn it on with Upgrade (agent page → Upgrade): this issues a new version with a new ASTRA-id and retires the old one. The agent's Workforce Guard checkpoint follows it to the new version, at the same URL.
In the policy editor, switch on Dashboard access. The defaults are:
Under the hood these are ordinary policy actions — dashboard.signin, dashboard.read and dashboard.change — on resources named dashboard:<area> (for example dashboard:agents, dashboard:endpoints, dashboard:visit-intelligence). Narrow the agent to particular areas with dashboard:<area> entries under Scope. The owner's sign-in approval lasts 30 minutes by default, or the policy's maximum session duration (at most 8 hours); each session token lasts at most 30 minutes of it and is renewed (see Renewing a session).
Use an enrolment token from Enterprise Governance → Fleet. Two options:
# One user on this machine (default) — no administrator rights needed
astrasync guard enroll <token>
# The whole machine (typically pushed by MDM) — needs administrator rights
astrasync guard enroll <token> --systemastrasync guard browse \
--checkpoint <checkpoint public URL> \
--slug <the agent's checkpoint slug> \
[--upstream <AstraSync API upstream slug, default astrasync-api>] \
[--port <local proxy port>] \
[--host <extra host that should get the device credential>] \
[--open]The command:
The link doesn't work in your everyday browser: it must go through the proxy. Add --open and the command starts Chrome, Edge or Chromium through the proxy, on its own profile, as soon as the sign-in is approved. On WSL it prefers a Chromium installed inside WSL — a Windows browser may not reach the proxy there; install one with npx playwright install chromium.
Without --open, the command prints a browser command to paste (PowerShell on Windows and WSL). It includes the proxy port and the fingerprint of the proxy's local certificate, so the browser trusts that one certificate and checks every other site as usual. Chrome shows a warning bar about that flag; that's expected, so close it. The command looks like this:
# macOS / Linux
google-chrome --proxy-server="http://127.0.0.1:<port>" \
--ignore-certificate-errors-spki-list=<fingerprint> \
--user-data-dir="/tmp/astrasync-agent" '<the one-time sign-in URL>'
# Windows (PowerShell)
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server="http://127.0.0.1:<port>" --ignore-certificate-errors-spki-list=<fingerprint> --user-data-dir="$env:TEMP\astrasync-agent" '<the one-time sign-in URL>'Opening the proxy address (http://127.0.0.1:<port>) directly shows a short page saying it only works as a browser proxy.
For a Playwright-driven browser, point it at the proxy the command prints:
const browser = await chromium.launch({ proxy: { server: 'http://127.0.0.1:<port>' } });
const context = await browser.newContext({ ignoreHTTPSErrors: true }); // the proxy's local certificate
const page = await context.newPage();
await page.goto('<the one-time sign-in URL>');Keep the command running for the whole session; Ctrl-C stops the proxy.
Every request in the session must carry that machine's device credential. The session ends when:
A session token lasts at most 30 minutes, but the owner's passkey approval lasts the policy's maximum session duration (never past the policy's end time or end date). Within that window the agent renews without asking the owner again: POST /api/agent-sessions/<sessionId>/renew, sent like sign-in through the agent's checkpoint (a verified agent that answers its runtime challenge, from the same machine; add the route to the site's route policy with action dashboard.signin). The answer is the same as redeeming a sign-in code — a new sessionId, expiresAt, approvalExpiresAt and session cookies — and the old token stops working. The agent's current policy is checked again each time, so a suspended agent, a narrowed policy or a closed window stops renewal, and so does End session. Once the approval has run out the answer is 403 approval_expired: sign in again for a new approval.
202 OWNER_APPROVAL_REQUIRED with an approvalId; the dashboard shows a waiting dialog and retries once after the owner approves. An approval covers that one request only./auth/*), passkeys, minting or rotating any key, token or credential, verify-access, and internal routes. Anything the dashboard doesn't map to an area is refused too./agent-session page shows the session.DEVICE_CREDENTIAL_REQUIRED — the request didn't come from an enrolled machine (run astrasync guard browse).DEVICE_NOT_IN_ORG — the machine is revoked or enrolled in a different organisation from the agent's.AGENT_SESSION_DENIED — the agent's policy doesn't allow dashboard sign-in (turn on Dashboard access with Upgrade).AGENT_NOT_ACTIVE — the agent is retired, suspended or not yet approved.AGENT_SESSION_FORBIDDEN — the route is never available to an agent session.approval_expired — renewal refused: the sign-in approval ran out, the session ended, or the agent's policy no longer allows sign-in. Sign in again.