Sarthak Srivastava
Sarthak Srivastava

Reputation: 1518

Atlassian Connect-Express: JIRA REST API authentication within the JIRA plugin

i am using the atlassian-connect-express toolkit for creating Atlassian Connect based Add-ons with Node.js.

It provides Automatic JWT authentication of inbound requests as well as JWT signing for outbound requests back to the host.

The add-on is authenticated when i install it in the JIRA dashboard and return the following pay-load:

{ key: 'my-add-on',
  clientKey: '*****',
  publicKey: '********'
  sharedSecret: '*****'
  serverVersion: '100082',
  pluginsVersion: '1.3.491',
  baseUrl: 'https://myaccount.atlassian.net',
  productType: 'jira',
  description: 'Atlassian JIRA at https://myaccount.atlassian.net ',
  eventType: 'installed' }

But i am not able to authenticate the JIRA Rest Api with the JWT token generated by the framework. It throws below error message.

404 '{"errorMessages":["Issue does not exist or you do not have permission to see it."],"errors":{}}'

below is the code when i send a GET request:

 app.get('/getissue', addon.authenticate(), function(req, res){

 var request = require('request');
      request({
           url: 'https://myaccount.atlassian.net/rest/api/2/issue/ABC-1', 
           method: 'GET',   
    }, function(error, response, body){
        if(error){
            console.log("error!");
         }else{
            console.log(response.statusCode, body);
          }
    }); 
    res.render('getissue');
});

Below is the code for my app descriptor file:

{
"key": "my-add-on",
"name": "Ping Pong",
"description": "My very first add-on",
"vendor": {
    "name": "Ping Pong",
    "url": "https://www.example.com"
},
"baseUrl": "{{localBaseUrl}}",
"links": {
    "self": "{{localBaseUrl}}/atlassian-connect.json",
    "homepage": "{{localBaseUrl}}/atlassian-connect.json"
},
"authentication": {
    "type": "jwt"
},
"lifecycle": {
    "installed": "/installed"
},
"scopes": [
    "READ",
    "WRITE"
],
"modules": {
    "generalPages": [
        {
            "key": "hello-world-page-jira",
            "location": "system.top.navigation.bar",
            "name": {
                "value": "Hello World"
            },
            "url": "/hello-world",
            "conditions": [{
                "condition": "user_is_logged_in"
            }]
        },

            {
                "key": "getissue-jira",
                "location": "system.top.navigation.bar",
                "name": {
                    "value": "Get Issue"
                },
                "url": "/getissue",
                "conditions": [{
                    "condition": "user_is_logged_in"

                    }]                
        }
    ]
}

}

I am pretty sure this is not the correct way i am doing, Either i should use OAuth. But i want to make the JWT method for authentication work here.

Upvotes: 2

Views: 2740

Answers (2)

Miroslav Savovski
Miroslav Savovski

Reputation: 2500

You should be using global variable 'AP' that's initialized by JIRA along with your add-on execution. You may explore it with Chrome/Firefox Debug.

Have you tried calling ?

AP.request(..,...);

instead of "var request = require('request');" You may set at the top of the script follwing to pass JS hinters and IDE validations:

/* global AP */

And when using AP the URL should look like:

  url: /rest/api/2/issue/ABC-1  

instead of:

  url: https://myaccount.atlassian.net/rest/api/2/issue/ABC-1

My assumption is that ABC-1 issue and user credentials are verified and the user is able to access ABC-1 through JIRA UI.

Here is doc for ref.: https://developer.atlassian.com/cloud/jira/software/jsapi/request/

Upvotes: 0

Sarthak Srivastava
Sarthak Srivastava

Reputation: 1518

Got it working by checking in here Atlassian Connect for Node.js Express Docs Within JIRA ADD-On Signed HTTP Requests works like below. GET and POST both.

GET:

app.get('/getissue', addon.authenticate(), function(req, res){
        var httpClient = addon.httpClient(req);
        httpClient.get('rest/api/2/issue/ABC-1',
        function(err, resp, body) {
                Response = JSON.parse(body);                              
                 if(err){
                    console.log(err);
                 }else {
                   console.log('Sucessful')
                   }
             });
            res.send(response);
         });

POST:

 var httpClient = addon.httpClient(req);
            var postdata = {
        "fields": {
           "project":
           { 
              "key": "MYW"
           },
           "summary": "My Story Name", 
            "description":"My Story Description", 
           "issuetype": {
              "name": "Story"
           }
          }
        }
        httpClient.post({
           url: '/rest/api/2/issue/' ,
           headers: {
                    'X-Atlassian-Token': 'nocheck'
                   },
           json: postdata

           },function (err, httpResponse, body) {
                if (err) {
                    return console.error('Error', err);
                      }
               console.log('Response',+httpResponse)

              });

Upvotes: 1

Related Questions