12

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?

2
  • requests broke some compatibility after 1.0, and your jira-python is probably not compatible. I've made a pull request with some changes to support requests-1.0+ bitbucket.org/bspeakmon/jira-python/pull-request/11/… Commented Feb 22, 2013 at 20:30
  • @Neal Caidin, Kindly check my answer as that is an up-to-date answer as per the official documentation of Jira. Commented Sep 23, 2020 at 13:44

5 Answers 5

23

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
Sign up to request clarification or add additional context in comments.

2 Comments

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
How can I login if I'm registered using social sign up?
9

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.

Comments

5

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)

1 Comment

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.
2

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.

Comments

2

As of 2019 Atlassian has deprecated authorizing with passwords.

You can easily replace the password with an API Token created here.

Here's a minimalistic example:

pip install jira

from jira import JIRA

jira = JIRA("YOUR-JIRA-URL", basic_auth=("YOUR-EMAIL", "YOUR-API-TOKEN"))

issue = jira.issue("YOUR-ISSUE-KEY (e.g. ABC-13)")
print(issue.fields.summary)

I recommend storing your API Token as an environment variable and accessing it with os.environ[key].

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.