Basic authentication with jira-python

30,002

Solution 1

Here's how I use the jira module with authentication in a Python script:

from jira.client import JIRA
import logging

# Defines a function for connecting to Jira
def connect_jira(log, jira_server, jira_user, jira_password):
    '''
    Connect to JIRA. Return None on error
    '''
    try:
        log.info("Connecting to JIRA: %s" % jira_server)
        jira_options = {'server': jira_server}
        jira = JIRA(options=jira_options, basic_auth=(jira_user, jira_password))
                                        # ^--- Note the tuple
        return jira
    except Exception,e:
        log.error("Failed to connect to JIRA: %s" % e)
        return None

# create logger
log = logging.getLogger(__name__)

# NOTE: You put your login details in the function call connect_jira(..) below!

# create a connection object, jc
jc = connect_jira(log, "https://myjira.mydom.com", "myusername", "mypassword")

# print names of all projects
projects = jc.projects()
for v in projects:
       print v

Solution 2

Below Python script connects to Jira and does basic authentication and lists all projects.

from jira.client import JIRA
options = {'server': 'Jira-URL'}
jira = JIRA(options, basic_auth=('username', 'password'))
projects = jira.projects()
for v in projects:
   print v

It prints a list of all the project's available within your instance of Jira.

Solution 3

Problem:

As of June 2019, Atlassian Cloud users who are using a REST endpoint in Jira or Confluence Cloud with basic or cookie-based authentication will need to update their app or integration processes to use an API token, OAuth, or Atlassian Connect.

After June 5th, 2019 attempts to authenticate via basic auth with an Atlassian account password will return an invalid credentials error.

Reference: Deprecation of basic authentication with passwords for Jira and Confluence APIs

Solution to the Above-mentioned Problem:

You can use an API token to authenticate a script or other process with an Atlassian cloud product. You generate the token from your Atlassian account, then copy and paste it to the script.

If you use two-step verification to authenticate, your script will need to use a REST API token to authenticate.

Steps to Create an API Token from your Atlassian Account:

  1. Log in to https://id.atlassian.com/manage/api-tokens
  2. Click Create API token.
  3. From the dialog that appears, enter a memorable and concise Label for your token and click Create.
  4. Click Copy to clipboard, then paste the token to your script.

Reference: API tokens

Python 3.8 Code Reference

from jira.client import JIRA
jira_client = JIRA(options={'server': JIRA_URL}, basic_auth=(JIRA_USERNAME, JIRA_TOKEN))
issue = jira_client.issue('PLAT-8742')
print(issue.fields.summary)

Solution 4

Don't change the library, instead put your credentials inside the ~/.netrc file.

If you put them there you will also be able to test your calls using curl or wget.

I am not sure anymore about compatibility with Jira 5.x, only 7.x and 6.4 are currently tested. If you setup an instance for testing I could modify the integration tests to run against it, too.

My lucky guess is that you broke it with that change.

Share:
30,002
Admin
Author by

Admin

Updated on August 10, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm new to Python, new to the jira-python library, and new to network programming, though I do have quite a bit of experience with application and integration programming and database queries (though it's been a while).

    Using Python 2.7 and requests 1.0.3

    I'm trying to use this library - http://jira-python.readthedocs.org/en/latest/ to query Jira 5.1 using Python. I successfully connected using an unauthenticated query, though I had to make a change to a line in client.py, changing

    I changed

    self._session = requests.session(verify=verify, hooks={'args': self._add_content_type}) 
    

    to

    self._session = requests.session() 
    

    I didn't know what I was doing exactly but before the change I got an error and after the change I got a successful list of project names returned.

    Then I tried basic authentication so I can take advantage of my Jira permissions and do reporting. That failed initially too. And I made the same change to

    def _create_http_basic_session
    

    in client.py , but now I just get another error. So problem not solved. Now I get a different error:

    HTTP Status 415 - Unsupported Media Type
    type Status report
    message Unsupported Media Type
    
    description The server refused this request because the request entity is in
    a format not` `supported by the requested resource for the requested method 
    (Unsupported Media Type).
    

    So then I decided to do a super simple test just using the requests module, which I believe is being used by the jira-python module and this code seemed to log me in. I got a good response:

    import requests
    
    r = requests.get(the_url, auth=(my username , password))
    print r.text
    

    Any suggestions?

  • mdoar
    mdoar over 8 years
    It's the object you use to connect to JIRA. If you are using https it may be due to not having the cert. There is a validation param to set to false in jira_options for that case
  • Hugo Sousa
    Hugo Sousa about 8 years
    How can I login if I'm registered using social sign up?
  • user1767754
    user1767754 about 3 years
    Is there no way to not use plain password and not use the api-token? Other tools allow to open a page to generate a token or save the active sessions once.