React + Atlassian Jira Cloud Api + Cors Anywhere: добавление рабочего журнала через POST возвращает 403

Застрял на этом в течение нескольких дней. Я делаю приложение в React, которое использует API Jira Cloud Rest от Atlassian, и я хочу регистрировать работу над проблемой Jira из своего приложения. Однако каждый раз, когда я пытаюсь получить 403. Один и тот же запрос в Postman работает, он создает рабочий журнал, что странно. Я установил сертификат и использую cors-where, чтобы иметь возможность использовать HTTPS в своем приложении React, но в остальном запрос такой же.

Я прочитал несколько статей на форумах Atlassian о том, что люди не уверены, что делать, когда им нужно POST к Atlassian API. Это что-то странное, что не может быть исправлено, или я пропустил соответствующий заголовок?

Вот вызов извлечения, который я делаю в ComponentDidMount() моего приложения React. https://localhost:8080/ - это прокси, который я использую для CORS-where/Yarn.

fetch("https://localhost:8080/my-domain.atlassian.net/rest/api/2/issue/ISSUE-1/worklog,{
            headers: {
              "Access-Control-Allow-Origin": "https://localhost:3000/",
              "X-Atlassian-Token": "no-check",
              "Content-Type": "application/json;charset=UTF-8",
              "Authorization": "Basic base64token",

            },
            method: "POST",
            responseType: 'json',
            body: {
                 "timeSpent":"2h 48m",
                 "author":{
                      "accountId":"123456789",      
                      "active":true,
                      "avatarUrls":{
                             "16x16":"https://avatar-cdn.atlassian.com/...",
                             "24x24":"https://avatar-cdn.atlassian.com/...",
                             "32x32":"https://avatar-cdn.atlassian.com/...",
                             "48x48":"https://avatar-cdn.atlassian.com/..."
                      },
                      "displayName":"User Name", 
                      "emailAddress":"user.name@gmail.com",
                      "key":"user.name",
                      "name":"user.name",
                      "self":"https://my-domain.atlassian.net/rest/api/2/user?username=user.name",
                      "timeZone":"Europe/Stockholm"
                  },
                  "comment":"bla bla bla",
                  "started":"2018-07-19T21:32:18.843+0200"
             }
        })
        .then((res) => res.json())
        .then(function(resJson){ 
            console.log(resJson
        })

И это мой server.js, который запускает Yarn.

const path = require('path')
const fs = require('fs')
const express = require('express')
const https = require('https')

const app = express();
const host = process.env.HOST || '0.0.0.0';
const port = process.env.PORT || 8080;

const cors_proxy = require('cors-anywhere');
cors_proxy.createServer({
    httpsOptions: {
        key: fs.readFileSync(path.resolve('server.key')),
        cert: fs.readFileSync(path.resolve('server.crt'))
    },
    originWhitelist: ['https://localhost:3000', 'https://localhost:8080'], 
    requireHeader: ['origin', 'x-requested-with'],
    removeHeaders: ['cookie', 'cookie2']
}).listen(port, host, function() {
    console.log('Running CORS Anywhere on ' + host + ':' + port);
});

1 ответ

Решение

Вместо использования базовой аутентификации вы должны рассмотреть возможность создания надстройки Atlassian Connect. Для начала вы можете использовать https://bitbucket.org/atlassian/atlassian-connect-express, он будет заниматься установкой дополнения и проверкой токенов JWT. По сути, вы сможете делать безопасные вызовы с вашего сервера (подписанные с помощью токенов JWT) или делать вызовы Jira API с вашего внешнего интерфейса (встроенного в Jira), который будет выполняться как отдельный пользователь, который будет генерировать правильные "обновленные" по записи.

Другие вопросы по тегам