As an enterprise developer, I want to authenticate using my organization's SSO provider so that I can use qctl without managing separate credentials.
# Configure SSO provider qctl auth sso configure --provider okta --issuer https://myorg.okta.com # Login via SSO qctl auth sso login # Check SSO status qctl auth sso status # Remove SSO configuration qctl auth sso remove
┌─────────────────────────────────────────────────────────────────┐ │ SSO Configuration │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ qctl auth sso configure │ │ │ │ │ ▼ │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ Detect │────▶│ Fetch OIDC │────▶│ Store Provider │ │ │ │ Provider │ │ Metadata │ │ Config │ │ │ └─────────────┘ └──────────────┘ └──────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐│ │ │ Supported Providers: ││ │ │ - Okta (OIDC) ││ │ │ - Azure AD (OIDC/SAML) ││ │ │ - Google Workspace (OIDC) ││ │ │ - OneLogin (OIDC/SAML) ││ │ │ - Custom OIDC (any compliant provider) ││ │ │ - Custom SAML 2.0 ││ │ └─────────────────────────────────────────────────────────────┘│ │ │ └─────────────────────────────────────────────────────────────────┘
$ qctl auth sso configure --provider okta --issuer https://myorg.okta.com Fetching OIDC discovery metadata... Provider: Okta Issuer: https://myorg.okta.com Authorization: https://myorg.okta.com/oauth2/v1/authorize Token: https://myorg.okta.com/oauth2/v1/token SSO configured successfully. Run 'qctl auth sso login' to authenticate. $ qctl auth sso login Opening browser for SSO authentication... Waiting for callback... Authentication successful! User: james.maes@acme.com Organization: ACME Corp Roles: developer, admin Token expires: 2026-01-04 10:30:00 UTC $ qctl auth sso status Provider: Okta Status: Authenticated User: james.maes@acme.com Organization: ACME Corp Token expires in: 7h 23m
┌──────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ qctl │ │ Browser │ │ IdP │ │ Voyage │ └──┬───┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ │ Start SAML │ │ │ │──────────────▶ │ │ │ │ AuthnRequest │ │ │ │───────────────▶ │ │ │ │ │ │ │ Login Page │ │ │ │◀──────────────│ │ │ │ │ │ │ │ User Authenticates │ │ │───────────────▶ │ │ │ │ │ │ │ SAMLResponse │ │ │ │◀──────────────│ │ │ │ │ │ │ Callback with assertion │ │ │◀─────────────│ │ │ │ │ │ │ │ Exchange assertion for token │ │─────────────────────────────────────────────▶ │ │ │ │ │ Access Token │ │ │◀─────────────────────────────────────────────
# ~/.config/qctl/sso.yaml provider: okta type: oidc issuer: https://myorg.okta.com client_id: 0oa1234567890abcdef scopes: - openid - profile - email - groups redirect_uri: http://localhost:8400/callback
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SSOCommand.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ConfigureCommand.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SSOLoginCommand.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/StatusCommand.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/OIDCClient.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SAMLClient.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ProviderConfig.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/CallbackServer.java
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ProviderDetector.java
No dependencies set.
The note is not visible to the blocked user.
User Story
As an enterprise developer, I want to authenticate using my organization's SSO provider so that I can use qctl without managing separate credentials.
Design
Command Interface
SSO Configuration Flow
Output Format
SAML Flow
Configuration File
Files to Create/Modify
qctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SSOCommand.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ConfigureCommand.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SSOLoginCommand.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/StatusCommand.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/OIDCClient.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/SAMLClient.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ProviderConfig.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/CallbackServer.javaqctl-core/src/main/java/io/qrun/qctl/core/auth/sso/ProviderDetector.javaImplementation Tasks
Acceptance Criteria