2

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.

2 Answers 2

1

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)

              });
Sign up to request clarification or add additional context in comments.

Comments

0

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/

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.