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:
<span>{</span><span> key</span><span>:</span> <span>'my-add-on'</span><span>,</span><span> clientKey</span><span>:</span> <span>'*****'</span><span>,</span><span> publicKey</span><span>:</span> <span>'********'</span><span> sharedSecret</span><span>:</span> <span>'*****'</span><span> serverVersion</span><span>:</span> <span>'100082'</span><span>,</span><span> pluginsVersion</span><span>:</span> <span>'1.3.491'</span><span>,</span><span> baseUrl</span><span>:</span> <span>'https://myaccount.atlassian.net'</span><span>,</span><span> productType</span><span>:</span> <span>'jira'</span><span>,</span><span> description</span><span>:</span> <span>'Atlassian JIRA at https://myaccount.atlassian.net '</span><span>,</span><span> eventType</span><span>:</span> <span>'installed'</span> <span>}<br><br></span>But i am not able to authenticate the JIRA Rest Api with the JWT token generated by the framework. It throws below error message
<span>404</span> <span>'{"errorMessages":["Issue does not exist or you do not have permission to see it."],"errors":{}}'</span>below is the code when i send a GET request:
<span>app</span><span>.</span><span>get</span><span>(</span><span>'/getissue'</span><span>,</span><span> addon</span><span>.</span><span>authenticate</span><span>(),</span> <span>function</span><span>(</span><span>req</span><span>,</span><span> res</span><span>){</span>
<span>var</span><span> request </span><span>=</span><span> require</span><span>(</span><span>'request'</span><span>);</span><span> request</span><span>({</span><span> url</span><span>:</span> <span>'https://myaccount.atlassian.net/rest/api/2/issue/ABC-1'</span><span>,</span><span>
method</span><span>:</span> <span>'GET'</span><span>,</span>
<span>},</span> <span>function</span><span>(</span><span>error</span><span>,</span><span> response</span><span>,</span><span> body</span><span>){</span>
<span>if</span><span>(</span><span>error</span><span>){</span><span> console</span><span>.</span><span>log</span><span>(</span><span>"error!"</span><span>);</span>
<span>}</span><span>else</span><span>{</span><span> console</span><span>.</span><span>log</span><span>(</span><span>response</span><span>.</span><span>statusCode</span><span>,</span><span> body</span><span>);</span>
<span>}</span>
<span>});</span><span>
res</span><span>.</span><span>render</span><span>(</span><span>'getissue'</span><span>);</span>
<span>});</span>Below is the code for my app descriptor file:
<span>{</span>
<span>"key"</span><span>:</span> <span>"my-add-on"</span><span>,</span>
<span>"name"</span><span>:</span> <span>"Ping Pong"</span><span>,</span>
<span>"description"</span><span>:</span> <span>"My very first add-on"</span><span>,</span>
<span>"vendor"</span><span>:</span> <span>{</span>
<span>"name"</span><span>:</span> <span>"Ping Pong"</span><span>,</span>
<span>"url"</span><span>:</span> <span>"https://www.example.com"</span>
<span>},</span>
<span>"baseUrl"</span><span>:</span> <span>"{{localBaseUrl}}"</span><span>,</span>
<span>"links"</span><span>:</span> <span>{</span>
<span>"self"</span><span>:</span> <span>"{{localBaseUrl}}/atlassian-connect.json"</span><span>,</span>
<span>"homepage"</span><span>:</span> <span>"{{localBaseUrl}}/atlassian-connect.json"</span>
<span>},</span>
<span>"authentication"</span><span>:</span> <span>{</span>
<span>"type"</span><span>:</span> <span>"jwt"</span>
<span>},</span>
<span>"lifecycle"</span><span>:</span> <span>{</span>
<span>"installed"</span><span>:</span> <span>"/installed"</span>
<span>},</span>
<span>"scopes"</span><span>:</span> <span>[</span>
<span>"READ"</span><span>,</span>
<span>"WRITE"</span>
<span>],</span>
<span>"modules"</span><span>:</span> <span>{</span>
<span>"generalPages"</span><span>:</span> <span>[</span>
<span>{</span>
<span>"key"</span><span>:</span> <span>"hello-world-page-jira"</span><span>,</span>
<span>"location"</span><span>:</span> <span>"system.top.navigation.bar"</span><span>,</span>
<span>"name"</span><span>:</span> <span>{</span>
<span>"value"</span><span>:</span> <span>"Hello World"</span>
<span>},</span>
<span>"url"</span><span>:</span> <span>"/hello-world"</span><span>,</span>
<span>"conditions"</span><span>:</span> <span>[{</span>
<span>"condition"</span><span>:</span> <span>"user_is_logged_in"</span>
<span>}]</span>
<span>},</span>
<span>{</span>
<span>"key"</span><span>:</span> <span>"getissue-jira"</span><span>,</span>
<span>"location"</span><span>:</span> <span>"system.top.navigation.bar"</span><span>,</span>
<span>"name"</span><span>:</span> <span>{</span>
<span>"value"</span><span>:</span> <span>"Get Issue"</span>
<span>},</span>
<span>"url"</span><span>:</span> <span>"/getissue"</span><span>,</span>
<span>"conditions"</span><span>:</span> <span>[{</span>
<span>"condition"</span><span>:</span> <span>"user_is_logged_in"</span>
<span>}]</span>
<span>}</span>
<span>]</span>
<span>}}</span>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.