When working with Azure DevOps repositories, Personal Access Tokens (PATs) offer an alternative to traditional authentication. Although I would not recommend them for general usage, there are some scenario's where a PAT is a secure option providing security through scoped permissions, expiration dates, and the ability to revoke access without changing your primary credentials.
I had a situation where I needed to clone a set of GIT repositories and run a scan on each repository. As the script would be running for a long time I thought it would be better to create and use a PAT instead of my own account.
Creating a Personal Access Token (PAT)
- Sign in to your Azure DevOps organization
- Click on your profile icon in the top right corner
- Select "Personal access tokens"
- Click "+ New Token"
- Configure your token:
- Give it a meaningful name
- Set an expiration date
- Select the organization
- Under "Scopes," select "Code" with "Read" permissions (or "Read & write" if you need to push changes)
- Click "Create"
Cloning an Azure DevOps Git repo using a PAT
Depending if you are using Azure Devops Services (cloud) or Azure DevOps Server (on-prem) the approach is a little bit different:
Method 1: Azure DevOps Services (Cloud)
For Azure DevOps Services (the cloud-hosted version), you can embed the PAT directly in the clone URL:
git clone https://<PAT>@<organization>.visualstudio.com/<organization>/_git/<repository>
Method 2: Azure DevOps Server (On-Premises)
For Azure DevOps Server installations, the authentication method differs. You need to use the Authorization header with Base64-encoded credentials:
git -c http.extraheader='Authorization: Basic [base64_encoded_credentials]' clone https://<server>:<port>/tfs/<collection>/_git/<repository>
You need to encode the string "username:PAT" in Base64 format.
On Linux/Mac:
echo -n "username:your_pat_token" | base64
On Windows (PowerShell):
[Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("username:your_pat_token"))
To avoid typing the header for every command, you can configure it in your repository git config:
# Set the extra header configuration
git config http.extraheader "Authorization: Basic [base64_credentials]"