Manage GitLab CLI authentication including login/logout, check auth status, switch accounts, and configure Docker registry access. Use when setting up glab for first time, troubleshooting auth issues, switching GitLab instances/accounts, or configuring Docker to pull from GitLab registry. Triggers on auth, login, logout, authentication, credentials, token, Docker registry.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Manage GitLab CLI authentication including login/logout, check auth status, switch accounts, and configure Docker registry access. Use when setting up glab for first time, troubleshooting auth issues, switching GitLab instances/accounts, or configuring Docker to pull from GitLab registry. Triggers on auth, login, logout, authentication, credentials, token, Docker registry.
glab auth
Manage GitLab CLI authentication.
Quick start
# Interactive login
glab auth login
# Browser/OAuth login without the prompt
glab auth login --hostname gitlab.com --web
# Check current auth status
glab auth status
# Login to different instance
glab auth login --hostname gitlab.company.com
# Logout
glab auth logout
Workflows
First-time setup
Run glab auth login
Choose authentication method (token or browser)
Follow prompts for your GitLab instance
Verify with glab auth status
glab auth login supports a complete setup flow:
--ssh-hostname to explicitly set a different SSH endpoint for self-hosted instances
--web to skip the login-type prompt and go straight to browser/OAuth auth
--container-registry-domains to preconfigure registry / dependency-proxy domains during login
Example: API hostname gitlab.company.com, SSH hostname ssh.company.com
# Self-managed GitLab with separate API and SSH endpoints
# Skip prompts and go straight to browser/OAuth auth
# Preconfigure multiple registry / dependency proxy domains during login
"registry.gitlab.com,gitlab.com"
# Explicitly opt out of keyring storage (stores the token as plaintext)
Credential storage
On a normal workstation, glab auth login stores credentials in the operating system keyring by default when one is available: macOS Keychain, Windows Credential Manager, or Linux Secret Service. The old --use-keyring flag is deprecated because keyring storage is now the default. Re-running login migrates a credential previously stored as plaintext in the config file into the keyring.
Use --insecure-storage only when plaintext config-file storage is explicitly required and its risk is accepted. If no keyring backend is available, glab warns and falls back to the config file. In CI (GITLAB_CI or CI is set), glab defaults to config-file storage because keyrings are usually unavailable or ephemeral; prefer environment credentials rather than persisting a login there.
If a keyring is locked, unavailable, or denies access, glab reports the credential-read failure directly. Fix keyring access or re-authenticate instead of treating the resulting error as an invalid token.
When re-authenticating interactively, glab preserves saved per-host values such as a custom API host, SSH host, and container-registry domains unless you explicitly override them with flags or prompts. Verify these values after re-authentication instead of deleting the config preemptively:
glab config get api_host --host gitlab.company.com
glab config get ssh_host --host gitlab.company.com
glab config get container_registry_domains --host gitlab.company.com
Non-interactive login also persists explicitly supplied --git-protocol and --api-protocol values in the host configuration. This applies to token/stdin and other prompt-free login paths, so automation can configure the protocols in the same login operation instead of requiring a later config edit. Verify the resulting host entry before relying on it:
Keep token files outside version control and do not print their contents.
CI auto-login:GLAB_ENABLE_CI_AUTOLOGIN=true lets glab use CI_JOB_TOKEN in GitLab CI/CD without a stored login. GITLAB_TOKEN, GITLAB_ACCESS_TOKEN, and OAUTH_TOKEN still take precedence, so leave them unset when the intended credential is CI_JOB_TOKEN. Use explicit env tokens instead when a command needs a project, group, or personal access token.
Agentic and multi-account setups
If you need different agents to show up as different GitLab users, use distinct GitLab bot/service accounts. Multiple PATs on one GitLab user are useful for rotation or scope separation, but they do not create distinct visible identities.
Use the Actor identity for actor-authored GitLab comments, replies, approvals, and other writes. Use an agent identity only when the GitLab action is explicitly that agent's own work product. Pick the intended visible actor before the first write.
A good operational pattern is one env file per actor:
Keep these env files outside version control, restrict their permissions (for example chmod 600), be mindful of backup exposure, and prefer least-privilege bot/service-account tokens. In a reused shell, clear stale GitLab auth vars first or start a fresh shell.
If the file uses plain KEY=value lines, load it with exported vars before running glab:
unset GITLAB_TOKEN GITLAB_ACCESS_TOKEN OAUTH_TOKEN GITLAB_HOST
set -a
source ~/.config/openclaw/env/gitlab-<actor>.envset +a
Why this matters:
plain source does not necessarily export variables to child processes
glab only sees env vars that are exported
if glab cannot see the env token, it may silently fall back to shared stored auth in the active global config file
if another env file was sourced earlier in the same shell/session, identity can be sticky in ways that are unsafe for writes unless you deliberately switch and verify
That fallback/shared-auth behavior is convenient for humans, but in multi-agent automation it can cause the wrong GitLab account to post comments, create MRs, or approve work.
Required pre-flight before any GitLab write
Run this immediately before any GitLab write, including glab mr note, review submission or approval, thread replies, and any glab apiPOST/PATCH/PUT/DELETE call:
glab auth status --hostname "$GITLAB_HOST"
glab api --hostname "$GITLAB_HOST" user
This assumes the target actor env file set GITLAB_HOST for the exact GitLab instance you intend to modify. Do not write until both commands clearly show the intended visible actor on that host.
Wrong-identity remediation
If a comment or reply was posted under the wrong identity:
Stop posting.
Delete the mistaken comment or reply if cleanup is needed.
unset GITLAB_TOKEN GITLAB_ACCESS_TOKEN OAUTH_TOKEN GITLAB_HOST or start a fresh shell.
Source the correct env file with set -a; source ...; set +a.
Rerun glab auth status --hostname "$GITLAB_HOST" and glab api --hostname "$GITLAB_HOST" user.
Repost under the correct actor.
Verify the thread no longer shows the wrong visible author for the replacement message.
If the wrong-identity write changed state beyond a comment or reply, re-auth as above and then use the matching GitLab reversal for that write under the correct actor and host, such as unapproving an MR or issuing the compensating glab api --hostname "$GITLAB_HOST" mutation for the exact resource that was changed.
Re-login still looks stuck after changing auth method:
If you switched from browser/OAuth login to token-based login and glab still appears to use stale stored credentials, run glab auth login again instead of assuming the config must be edited manually.
After re-login, verify with glab auth status before retrying the failing command.
Env-token auth failures:
If GITLAB_TOKEN, GITLAB_ACCESS_TOKEN, or OAUTH_TOKEN is exported, it overrides stored credentials.
GITLAB_TOKEN and GITLAB_ACCESS_TOKEN are treated as personal access tokens independently of a stored OAuth profile, so a temporary PAT does not inherit or refresh saved OAuth state.
If auth suddenly fails, check whether an env token is being picked up before assuming your saved login is broken. glab auth login and glab auth status warn when this precedence applies.
Run type glab to distinguish a wrapper that intentionally injects a token (for example, a 1Password shell plugin alias) from a plain executable path. A wrapper can be expected and need no action; a plain path means the token came from the shell profile, current environment, or CI variables.
These failures can affect both read operations and writes, not just write pre-flight checks.
Verify the active actor and token path with glab auth status and glab api user before any GitLab write.
In multi-agent shells, deliberately re-source the intended env file with set -a; source ...; set +a before retrying.
Self-managed OAuth URL or refresh problems:
Re-authenticate with the full configured host/subfolder; browser OAuth includes the configured subfolder in its authorization URL.
A re-authentication response that omits a replacement refresh token preserves the existing refresh token instead of clearing it.
Multiple instances:
Use --hostname flag to specify instance
Each instance maintains separate auth
Docker authentication fails:
Re-run: glab auth configure-docker
Check Docker config: cat ~/.docker/config.json
Verify helper is set: "credHelpers": { "registry.gitlab.com": "glab-cli" }