Update/add username in url in python

Question:

If I have a URL (ex: “ssh://[email protected]:553/random_uri”, “https://test.blah.blah:993/random_uri2“), I want to set/update the username in the url.
I know there is urllib.parse.urlparse (https://docs.python.org/3/library/urllib.parse.html) that would break them down but I am having trouble creating a new url (or updating) the parsed result with the username I intend to use.

Is there any python library that can help set/update username? Preferably using the parsed result of an urlparse.

Asked By: ozn

||

Answers:

Found a way to do this: https://sdqali.in/blog/2017/09/25/python-url-manipulation-revisited/
Can create a ‘furl’ object, set username, and get updated url string.

Answered By: ozn

Let me to show a script without 3rd package.

from urllib.parse import urlparse

old_url = "https://user:[email protected]"
user="user-01"
password="my-secure-password"

_url = urlparse(old_url)
domain = _url.netloc.split("@")[-1]
new_url = "{}://{}:{}@{}".format(_url.scheme, user,password, domain)

Run the script, the variable new_url contains your url with new user and password.

Answered By: Egalicia

Python urllib.parse does not have a nice method to set/edit or remove username/password from URLs.
However, you can use the netloc attribute. See the example function below.

from urllib.parse import urlparse, quote

def set_url_username_password(url, username, password):
  _username = quote(username)
  _password = quote(password)
  _url = urlparse(url)
  _netloc = _url.netloc.split('@')[-1]
  _url = _url._replace(netloc=f'{_username}:{_password}@{_netloc}')
  return _url.geturl()

original_url = 'https://google.com'
username = 'username'
password = 'pa$$word'
new_url = set_url_username_password(original_url, username, password)

new_url will be set to https://username:pa%24%[email protected].

Note that this function replaces any existing credentials with the new ones.

Here is a bonus function to remove credentials from an URL:

from urllib.parse import urlparse

def unset_url_username_password(url):
  _url = urlparse(url)
  _netloc = _url.netloc.split('@')[-1]
  _url = _url._replace(netloc=_netloc)
  return _url.geturl()
Answered By: zadkiel

Here’s an option that retains everything in the input URL (just adds or updates the auth), using stdlib only:

from urllib.parse import urlparse, urlunparse


def inject_auth_to_url(url: str, user: str, password: str) -> str:
    parsed = urlparse(url)
    
    # works no matter if the original url had a user/pass or not
    domain = parsed.netloc.split("@")[-1]
    domain = f"{user}:{password}@{domain}"

    unparsed = (parsed[0], domain, parsed[2], parsed[3], parsed[4], parsed[5])

    return urlunparse(unparsed)
Answered By: f0ff886f
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.