Personal access tokens

Version history
  • Notifications for expiring tokens introduced in GitLab 12.6.
  • Token lifetime limits introduced in GitLab 12.6.
  • Additional notifications for expiring tokens introduced in GitLab 13.3.
  • Prefill for token name and scopes introduced in GitLab 14.1.

Personal access tokens can be an alternative to OAuth2 and used to:

  • Authenticate with the GitLab API.
  • Authenticate with Git using HTTP Basic Authentication.

In both cases, you authenticate with a personal access token in place of your password.

caution
The ability to create personal access tokens without expiry was deprecated in GitLab 15.4 and removed in GitLab 16.0. In GitLab 16.0 and later, existing personal access tokens without an expiry date are automatically given an expiry date of 365 days later than the current date. The automatic adding of an expiry date occurs on GitLab.com during the 16.0 milestone. The automatic adding of an expiry date occurs on self-managed instances when they are upgraded to GitLab 16.0. This change is a breaking change.

Personal access tokens are:

note
Though required, GitLab usernames are ignored when authenticating with a personal access token. There is an issue for tracking to make GitLab use the username.

For examples of how you can use a personal access token to authenticate with the API, see the API documentation.

Alternately, GitLab administrators can use the API to create impersonation tokens. Use impersonation tokens to automate authentication as a specific user.

Create a personal access token

Version history
  • Introduced in GitLab 15.3, default expiration of 30 days is populated in the UI.
  • Ability to create non-expiring personal access tokens removed in GitLab 16.0.

You can create as many personal access tokens as you like.

  1. On the left sidebar, select your avatar.
  2. Select Edit profile.
  3. On the left sidebar, select Access Tokens.
  4. Select Add new token.
  5. Enter a name and expiry date for the token.
    • The token expires on that date at midnight UTC.
    • If you do not enter an expiry date, the expiry date is automatically set to 365 days later than the current date.
    • By default, this date can be a maximum of 365 days later than the current date.
  6. Select the desired scopes.
  7. Select Create personal access token.

Save the personal access token somewhere safe. After you leave the page, you no longer have access to the token.

Prefill personal access token name and scopes

You can link directly to the Personal Access Token page and have the form prefilled with a name and list of scopes. To do this, you can append a name parameter and a list of comma-separated scopes to the URL. For example:

https://gitlab.example.com/-/profile/personal_access_tokens?name=Example+Access+token&scopes=api,read_user,read_registry
caution
Personal access tokens must be treated carefully. Read our token security considerations for guidance on managing personal access tokens (for example, setting a short expiry and using minimal scopes).

Revoke a personal access token

At any time, you can revoke a personal access token.

  1. On the left sidebar, select your avatar.
  2. Select Edit profile.
  3. On the left sidebar, select Access Tokens.
  4. In the Active personal access tokens area, next to the key, select Revoke.

View the last time a token was used

Version history
  • Introduced in GitLab 13.2. Token usage information is updated every 24 hours.
  • The frequency of token usage information updates changed in GitLab 16.1 from 24 hours to 10 minutes.

Token usage information is updated every 10 minutes. GitLab considers a token used when the token is used to:

  • Authenticate with the REST or GraphQL APIs.
  • Perform a Git operation.

To view the last time a token was used:

  1. On the left sidebar, select your avatar.
  2. Select Edit profile.
  3. On the left sidebar, select Access Tokens.
  4. In the Active personal access tokens area, next to the key, view the Last Used date.

Personal access token scopes

Version history
  • Personal access tokens no longer being able to access container or package registries introduced in GitLab 16.0.
  • k8s_proxy introduced in GitLab 16.4 with a flag named k8s_proxy_pat. Enabled by default.

A personal access token can perform actions based on the assigned scopes.

ScopeAccess
apiGrants complete read/write access to the API, including all groups and projects, the container registry, and the package registry.
read_userGrants read-only access to the authenticated user’s profile through the /user API endpoint, which includes username, public email, and full name. Also grants access to read-only API endpoints under /users.
read_apiGrants read access to the API, including all groups and projects, the container registry, and the package registry. (Introduced in GitLab 12.10.)
read_repositoryGrants read-only access to repositories on private projects using Git-over-HTTP or the Repository Files API.
write_repositoryGrants read-write access to repositories on private projects using Git-over-HTTP (not using the API).
read_registryGrants read-only (pull) access to a Container Registry images if a project is private and authorization is required. Available only when the Container Registry is enabled.
write_registryGrants read-write (push) access to a Container Registry images if a project is private and authorization is required. Available only when the Container Registry is enabled. (Introduced in GitLab 12.10.)
sudoGrants permission to perform API actions as any user in the system, when authenticated as an administrator.
admin_modeGrants permission to perform API actions as an administrator, when Admin Mode is enabled. (Introduced in GitLab 15.8.)
create_runnerGrants permission to create runners.
ai_featuresGrants permission to perform API actions for GitLab Duo.
k8s_proxyGrants permission to perform Kubernetes API calls using the agent for Kubernetes.
caution
If you enabled external authorization, personal access tokens cannot access container or package registries. If you use personal access tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use personal access tokens with container or package registries.

When personal access tokens expire

Personal access tokens expire on the date you define, at midnight, 00:00 AM UTC.

  • GitLab runs a check at 01:00 AM UTC every day to identify personal access tokens that expire in the next seven days. The owners of these tokens are notified by email.
  • GitLab runs a check at 02:00 AM UTC every day to identify personal access tokens that expire on the current date. The owners of these tokens are notified by email.
  • In GitLab Ultimate, administrators can limit the allowable lifetime of access tokens. If not set, the maximum allowable lifetime of a personal access token is 365 days.
  • In GitLab Free and Premium, the maximum allowable lifetime of a personal access token is 365 days.

Create a personal access token programmatically

You can create a predetermined personal access token as part of your tests or automation.

Prerequisite:

To create a personal access token programmatically:

  1. Open a Rails console:

    sudo gitlab-rails console
    
  2. Run the following commands to reference the username, the token, and the scopes.

    The token must be 20 characters long. The scopes must be valid and are visible in the source code.

    For example, to create a token that belongs to a user with username automation-bot and expires in a year:

    user = User.find_by_username('automation-bot')
    token = user.personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token', expires_at: 365.days.from_now)
    token.set_token('token-string-here123')
    token.save!
    

This code can be shortened into a single-line shell command by using the Rails runner:

sudo gitlab-rails runner "token = User.find_by_username('automation-bot').personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token', expires_at: 365.days.from_now); token.set_token('token-string-here123'); token.save!"

Revoke a personal access token programmatically

You can programmatically revoke a personal access token as part of your tests or automation.

Prerequisite:

To revoke a token programmatically:

  1. Open a Rails console:

    sudo gitlab-rails console
    
  2. To revoke a token of token-string-here123, run the following commands:

    token = PersonalAccessToken.find_by_token('token-string-here123')
    token.revoke!
    

This code can be shortened into a single-line shell command using the Rails runner:

sudo gitlab-rails runner "PersonalAccessToken.find_by_token('token-string-here123').revoke!"

Clone repository using personal access token

To clone a repository when SSH is disabled, clone it using a personal access token by running the following command:

git clone https://<username>:<personal_token>@gitlab.com/gitlab-org/gitlab.git

This method saves your personal access token in your bash history. To avoid this, run the following command:

git clone https://<username>@gitlab.com/gitlab-org/gitlab.git

When asked for your password for https://gitlab.com, enter your personal access token.

The username in the clone command:

  • Can be any string value.
  • Must not be an empty string.

Remember this if you set up an automation pipeline that depends on authentication.

Troubleshooting

Unrevoke a personal access token

If a personal access token is revoked accidentally by any method, administrators can unrevoke that token. By default, a daily job deletes revoked tokens at 1:00 AM system time.

caution
Running the following commands changes data directly. This could be damaging if not done correctly, or under the right conditions. You should first run these commands in a test environment with a backup of the instance ready to be restored, just in case.
  1. Open a Rails console.
  2. Unrevoke the token:

    token = PersonalAccessToken.find_by_token('<token_string>')
    token.update!(revoked:false)
    

    For example, to unrevoke a token of token-string-here123:

    token = PersonalAccessToken.find_by_token('token-string-here123')
    token.update!(revoked:false)
    

Alternatives to personal access tokens

For Git over HTTPS, an alternative to personal access tokens is to use an OAuth credential helper.