Atlassian Connect-Express:JIRA 插件中的 JIRA REST API 身份验证

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

我正在使用 atlassian-connect-express 工具包创建 Atlassian Connect based Add-ons with Node.js.

它提供入站请求的自动 JWT 身份验证以及返回主机的出站请求的 JWT 签名。

当我在 JIRA 仪表板中安装附加组件时,它已通过身份验证 return 以下有效负载:

{ 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' }

但我无法使用框架生成的 JWT 令牌对 JIRA Rest Api 进行身份验证。它会抛出以下错误消息。

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

下面是我发送 GET 请求时的代码:

 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');
});

下面是我的应用程序描述符文件的代码:

{
"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"

                    }]                
        }
    ]
}

}

我很确定这不是我的正确做法,要么我应该使用 OAuth。但我想让 JWT 方法在这里进行身份验证。

您应该使用由 JIRA 初始化的全局变量 'AP' 以及您的 add-on 执行。您可以使用 Chrome/Firefox Debug.

探索它

你试过打电话吗?

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

而不是 "var request = require('request');" 您可以在下面的脚本顶部设置以传递 JS 提示和 IDE 验证:

/* global AP */

并且在使用 AP 时 URL 应该如下所示:

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

而不是:

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

我的假设是 ABC-1 问题和用户凭据得到验证,并且用户能够通过 JIRA 访问 ABC-1 UI。

这是供参考的文档:https://developer.atlassian.com/cloud/jira/software/jsapi/request/

在此处签入即可使用 Atlassian Connect for Node.js Express Docs 在 JIRA ADD-On 中,签名 HTTP 请求的工作方式如下。 GET 和 POST 两者。

获取:

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)

              });