Summary
Client.authenticate() with DesktopAuth blocks indefinitely (no timeout, no error) after the 1Password desktop app has been running for an extended period, gone through lock/unlock cycles, or been restarted. The IPC channel between the SDK and the desktop app enters a broken state where connections are accepted but never answered.
Environment
- onepassword-sdk: 0.4.0
- Python: 3.11
- macOS: 15.5 (Sequoia)
- 1Password desktop app: latest (v8)
- 1Password CLI: 2.32.0
Steps to reproduce
- Set up a Python application that uses
DesktopAuth to authenticate:
from onepassword.client import Client, DesktopAuth
auth = DesktopAuth(account_name="my-account")
client = await Client.authenticate(
auth=auth,
integration_name="my-app",
integration_version="v1.0.0",
)
result = await client.secrets.resolve_all(["op://vault/item/field"])
- Use the application normally — authentication works on first use.
- Lock/unlock the 1Password desktop app (or let the Mac sleep/wake), or leave the app running for several hours.
- Call
Client.authenticate() again.
Expected behavior
Client.authenticate() should either:
- Successfully re-authenticate via the desktop app (prompting for biometrics if needed), or
- Raise an exception with a meaningful error after a reasonable timeout.
Actual behavior
Client.authenticate() hangs indefinitely — no biometrics prompt appears, no exception is raised, and the call never returns. The process must be killed externally.
The underlying libop_sdk_ipc_client.dylib appears to connect to the desktop app's Mach port successfully, but the desktop app never responds to the authentication request.
Workaround
The only reliable recovery is to force-kill all 1Password processes and relaunch:
pkill -9 -f 1Password
sleep 3
open -a "1Password"
# Unlock with Touch ID / master password
op whoami # verify IPC is working again
Regular quit (Cmd+Q) is not sufficient — the IPC stays broken until all processes are killed with -9.
We have switched our project to use the op CLI (subprocess.run(["op", "read", ...])) as the default backend due to this instability, keeping the SDK as an opt-in alternative.
Related issues
This is the same root cause reported across multiple 1Password integrations:
Suggestions
- Add a configurable timeout to
Client.authenticate() / DesktopAuth so callers aren't blocked forever.
- Detect stale IPC state and raise a clear error (e.g., "1Password desktop app is not responding — restart it") instead of hanging silently.
- Coordinate with the desktop app team — the bug appears to be in the app's IPC listener, not the SDK itself, but the SDK should be resilient to it.
Summary
Client.authenticate()withDesktopAuthblocks indefinitely (no timeout, no error) after the 1Password desktop app has been running for an extended period, gone through lock/unlock cycles, or been restarted. The IPC channel between the SDK and the desktop app enters a broken state where connections are accepted but never answered.Environment
Steps to reproduce
DesktopAuthto authenticate:Client.authenticate()again.Expected behavior
Client.authenticate()should either:Actual behavior
Client.authenticate()hangs indefinitely — no biometrics prompt appears, no exception is raised, and the call never returns. The process must be killed externally.The underlying
libop_sdk_ipc_client.dylibappears to connect to the desktop app's Mach port successfully, but the desktop app never responds to the authentication request.Workaround
The only reliable recovery is to force-kill all 1Password processes and relaunch:
Regular quit (Cmd+Q) is not sufficient — the IPC stays broken until all processes are killed with
-9.We have switched our project to use the
opCLI (subprocess.run(["op", "read", ...])) as the default backend due to this instability, keeping the SDK as an opt-in alternative.Related issues
This is the same root cause reported across multiple 1Password integrations:
planterraform-provider-onepassword#341 — Go SDK hangs identically via DesktopAuth after lock/unlock cycles. A 1Password contributor confirmed it appears to be a desktop app issue.ghshell-plugins#416 —op plugin runhangs; spindumps show threads blocked on__psynch_cvwaitwaiting for a desktop app response that never comes.op readgets stuck; desktop app logs showEndConnectionerrors.Suggestions
Client.authenticate()/DesktopAuthso callers aren't blocked forever.