DevOps

cURL Username Password Authentication: Complete Guide

Learn how to use cURL with username and password authentication. Complete guide covering basic auth, security considerations, and troubleshooting authentication errors.

1 answer 1 view

How do I use cURL to access a URL that requires username and password authentication? I’m currently trying to access an API endpoint with curl but getting an error. What command syntax should I use to include credentials with my cURL request?

To access a URL requiring username and password authentication with cURL, use the -u or --user flag followed by your credentials in the format username:password. The complete command syntax is curl -u username:password https://api.example.com/endpoint, which automatically encodes your credentials and adds the proper Authorization header to your HTTP request.

Contents



Understanding cURL Authentication


When accessing protected resources like API endpoints, authentication is required to verify your identity. cURL supports multiple authentication methods, with HTTP Basic Authentication being the most straightforward approach. This method encodes your username and password using Base64 and includes them in the Authorization header of your HTTP request.

HTTP Basic Authentication is supported by virtually all web servers and APIs, making it the most widely compatible authentication method. However, it’s important to understand that while the credentials are Base64-encoded, they’re essentially transmitted in clear text over the network unless combined with HTTPS encryption.

The official curl documentation explains that “The Basic authentication method sends the username and password in clear text over the network (base64 encoded) and should be avoided for HTTP transport.”


Basic Authentication with cURL


The -u Flag Method

The most common way to include credentials in a cURL command is using the -u or --user option:

bash
curl -u username:password https://api.example.com/endpoint

This command sets the username to username and password to password, which curl then base64-encodes and sends to the server in the Authorization header. The equivalent longer form is:

bash
curl --user username:password https://api.example.com/endpoint

Alternative Credential Placement

You can also include the credentials directly in the URL itself:

bash
curl https://username:password@api.example.com/endpoint

According to the Curl Cookbook, “This recipe puts the username and password bob:12345 in the URL itself. Curl is smart enough to figure it out and it does exactly the same as in the previous recipe, and performs the basic HTTP authentication with this username and password.”

Interactive Password Entry

For security reasons, you might want to avoid passing the password directly in the command line. cURL allows you to omit the password and be prompted for it:

bash
curl -u username https://api.example.com/endpoint

This approach prevents your password from being visible in your command history or process listings. As noted in the everything curl documentation, “One way to avoid passing the username and password on the command line is to instead use a .netrc file or a config file. You can also use the -u option without specifying the password, and then curl instead prompts the user for it when it runs.”


Alternative Authentication Methods


While Basic Authentication is the simplest method, cURL supports several other authentication protocols that offer better security:

Digest Authentication

Digest Authentication is more secure than Basic Authentication as it doesn’t send the password in clear text:

bash
curl --digest --user username:password https://api.example.com/endpoint

NTLM Authentication

For Windows environments, NTLM authentication is commonly used:

bash
curl --ntlm --user username:password https://api.example.com/endpoint

Negotiate (Kerberos) Authentication

For enterprise environments using Kerberos:

bash
curl --negotiate --user username:password https://api.example.com/endpoint

The official curl documentation explains these alternatives: “You can ask for those methods too specifically: curl --digest --user daniel:secret http://example.com/ curl --negotiate --user daniel:secret http://example.com/ curl --ntlm --user daniel:secret http://example.com/


Security Considerations


HTTPS Requirement

When using Basic Authentication, always use HTTPS to encrypt your credentials:

bash
curl -u username:password https://api.example.com/endpoint
# NOT
curl -u username:password http://api.example.com/endpoint

Credential Storage

For production environments, avoid passing credentials directly in commands. Instead, use environment variables:

bash
export USERNAME="your_username"
export PASSWORD="your_password"
curl -u $USERNAME:$PASSWORD https://api.example.com/endpoint

Or use a .netrc file:

bash
machine api.example.com
login your_username
password your_password

Then reference it with:

bash
curl -n https://api.example.com/endpoint

The Apify blog recommends: “Store credentials outside the command: export USERNAME="your_username" export PASSWORD="your_password"

Process Security

Be aware that passwords may be visible in process listings. The official curl documentation notes: “curl helps minimize that risk by trying to blank out passwords from process listings.”


Troubleshooting Common Issues


Authentication Errors

If you’re encountering authentication errors, verify your credentials and syntax:

bash
curl -v -u username:password https://api.example.com/endpoint

The -v flag provides verbose output, showing the exact headers being sent to help debug authentication issues.

Special Characters in Credentials

If your password contains special characters like @, :, or spaces, you need to URL-encode them or use quotes:

bash
curl -u 'username:p@ss w0rd' https://api.example.com/endpoint

Certificate Issues

If you’re using HTTPS and encountering certificate errors, you can bypass verification (not recommended for production):

bash
curl -k -u username:password https://api.example.com/endpoint

Proxy Authentication

If accessing through a proxy that requires authentication:

bash
curl -u username:password -U proxyuser:proxypass https://api.example.com/endpoint

Advanced Authentication Techniques


Using Headers Directly

For more control, you can manually construct the Authorization header:

bash
curl -H "Authorization: Basic $(echo -n username:password | base64)" https://api.example.com/endpoint

Combining with Other Options

cURL authentication can be combined with other options like custom headers, cookies, or JSON data:

bash
curl -u username:password \
 -H "Content-Type: application/json" \
 -d '{"key": "value"}' \
 https://api.example.com/endpoint

Using Config Files

For complex scenarios, create a cURL configuration file:

# .curlrc
user = "username:password"
header = "Content-Type: application/json"

Then use:

bash
curl -K .curlrc https://api.example.com/endpoint

Session Management

For APIs that use session-based authentication, first authenticate to get a token:

bash
# Get authentication token
TOKEN=$(curl -s -u username:password https://api.example.com/auth | jq -r '.token')

# Use token for subsequent requests
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/endpoint

Sources


  1. Curl Cookbook - Use the Basic HTTP Authentication with -u user:pass argument: https://catonmat.net/cookbooks/curl/use-basic-http-authentication
  2. Apify Blog - Basic auth in cURL: a complete guide covering security considerations: https://blog.apify.com/basic-auth-in-curl/
  3. Everything curl - Passwords documentation with detailed options for credential handling: https://everything.curl.dev/cmdline/passwords.html
  4. Everything curl - Authentication methods documentation covering Basic, Digest, NTLM, and Negotiate: https://everything.curl.dev/http/auth.html

Conclusion


Successfully accessing protected resources with cURL requires understanding the authentication syntax and choosing the right method for your security needs. The -u username:password flag provides the most straightforward approach to cURL username password authentication, while alternative methods like Digest or NTLM offer enhanced security for different environments. Always remember to use HTTPS with Basic Authentication to protect your credentials, and consider more secure storage methods like environment variables or .netrc files for production use. By following these practices, you can reliably authenticate with APIs and protected resources while maintaining appropriate security standards.

Authors
Verified by moderation
Moderation
cURL Username Password Authentication: Complete Guide