Hey, I’m trying to develop a forge app for confluence using a content action and space settings. I developed boilerplate code starting from the ‘hello world’ scaffolding code. The content action is calling the backend, this works fine; the space setting is also calling the backend, this does not work. I get ‘Failed to get context token: Token generation failed: Action not permitted.’ I was experimenting with the permission scopes in the manifest.yml, unfortunately nothing helps. I experimented with google antigravity for coding, but AI does not help either …
manifest.yml
modules:
confluence:contentAction:
- key: jsm-link-app-content-action
resource: content-action-resource
resolver:
function: content-action-resolver
render: native
title: JSM link app content action
target: confluencePage
confluence:spaceSettings:
- key: jsm-link-app-space-settings
resource: space-settings-resource
resolver:
function: space-settings-resolver
render: native
title: JSM link app space settings
route: jsm-link-app-space-settings
function:
- key: content-action-resolver
handler: index.contentActionResolver
- key: space-settings-resolver
handler: index.spaceSettingsResolver
resources:
- key: content-action-resource
path: src/frontend/content-action-resource.jsx
- key: space-settings-resource
path: src/frontend/space-settings-resource.jsx
permissions:
scopes:
- 'read:confluence-space.summary'
- 'write:confluence-space'
- 'read:confluence-content.all'
- 'read:confluence-user'
- 'read:confluence-groups'
- 'read:confluence-props'
app:
runtime:
name: nodejs22.x
memoryMB: 256
architecture: arm64
id: ari:cloud:ecosystem::app/ea9b3345-4b9c-48c5-9c0f-0a1d3765a0cf
resolvers/index.js
import Resolver from '@forge/resolver';
const resolver = new Resolver();
resolver.define('fetch', (req) => {
console.log("Resolver hit!", req);
const { parameter } = req.payload;
return parameter || 'No parameter provided!';
});
export const contentActionResolver = resolver.getDefinitions();
export const spaceSettingsResolver = resolver.getDefinitions();
frontent/space-settings-resource.jsx
import React, { useEffect, useState } from 'react';
import ForgeReconciler, { Text } from '@forge/react';
import { invoke } from '@forge/bridge';
const App = () => {
const [data, setData] = useState(null);
useEffect(() => {
invoke('fetch', { parameter: 'space settings' })
.then(setData)
.catch((err) => setData(`Error: ${err.message} \n ${JSON.stringify(err)}`));
}, []);
return (
<>
<Text>JSM link app - Space Settings</Text>
<Text>{data ? data : 'Loading...'}</Text>
</>
);
};
ForgeReconciler.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
Can somebody shine some light on this matter?
Tx in advance, Raf.