Autenticazione con OAuth
Per chiamare le API serve un access token, che l'applicazione ottiene con il flusso OAuth authorization code con PKCE. Gli attori sono tre: la tua applicazione (client), Riseact Account (server di autorizzazione) e Riseact Core (le API). Il token dà accesso alle risorse dell'organizzazione che installa l'applicazione.
1. Registra l'applicazione
Registra l'applicazione per ottenere client_id e client_secret.
2. Reindirizza al server di autorizzazione
Il backend espone un endpoint che reindirizza l'utente a Riseact Account con il client_id, le chiavi PKCE (code_verifier e code_challenge) e un state casuale contro il CSRF. Salva code_verifier e state: ti servono nella callback.
Quando un'organizzazione apre la tua applicazione, Riseact carica nell'iframe l'URL registrato aggiungendo il parametro __organization, con lo slug dell'organizzazione. Passalo al server di autorizzazione nel parametro __organization per saltare la scelta dell'organizzazione.
In node.js:
app.get('/oauth/authorize', (req, res) => {
const { codeChallenge, codeVerifier } = generatePkceKeys();
const state = crypto.randomBytes(16).toString('hex');
// Salva codeVerifier e state come preferisci. In questo caso utilizziamo un database
db.savePkceSession(state, { codeVerifier });
const params = {
client_id: CLIENT_ID,
redirect_uri: 'https://your-app.com/oauth/callback',
response_type: 'code',
code_challenge_method: 'S256',
code_challenge: codeChallenge,
state,
__organization: req.query.__organization,
};
res.redirect(`https://accounts.riseact.org/oauth/authorize/?${qs.stringify(params)}`);
});Con curl:
curl -X GET \
"https://accounts.riseact.org/oauth/authorize/\
?client_id=CLIENT_ID\
&redirect_uri=https://your-app.com/oauth/callback\
&response_type=code\
&code_challenge_method=S256\
&code_challenge=YOUR_CODE_CHALLENGE\
&state=YOUR_RANDOM_STATE\
&__organization=YOUR_ORGANIZATION"3. Gestisci la callback
Dopo l'autenticazione, l'utente torna al redirect_uri indicato, che deve essere fra quelli registrati. Il backend verifica che state corrisponda a quello salvato, recupera il code_verifier e scambia il codice di autorizzazione con un access token.
In node.js:
app.get('/oauth/callback', async (req, res) => {
const { code, state } = req.query;
// Recupera la sessione PKCE dal database usando lo state come chiave
const session = await db.getPkceSession(state);
if (!session) {
return res.status(400).send('Invalid state');
}
const formData = {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
grant_type: 'authorization_code',
code,
redirect_uri: 'https://your-app.com/oauth/callback',
code_verifier: session.codeVerifier,
};
const { data } = await axios.post('https://accounts.riseact.org/oauth/token/', qs.stringify(formData), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
// Salva le credenziali ottenute come preferisci. In questo caso utilizziamo un database
db.saveCredentials(data.access_token, data.refresh_token, data.expires_in);
});Con curl:
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "grant_type=authorization_code" \
-d "code=YOUR_CODE" \
-d "redirect_uri=https://your-app.com/oauth/callback" \
-d "code_verifier=YOUR_CODE_VERIFIER" \
https://accounts.riseact.org/oauth/token/4. Chiama le API
Passa l'access token nell'header Authorization.
In node.js:
const { data } = await axios.get('https://core.riseact.org/admin/graphql/', {
headers: {
Authorization: `Bearer ${access_token}`,
},
});Con curl:
curl -X GET \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
https://core.riseact.org/admin/graphql/5. Rinnova il token
L'access token scade (expires_in): rinnovalo prima della scadenza con il refresh token.
In node.js:
app.get('/oauth/refresh', async (req, res) => {
const { refresh_token } = req.query;
const formData = {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
grant_type: 'refresh_token',
refresh_token,
};
const { data } = await axios.post('https://accounts.riseact.org/oauth/token/', qs.stringify(formData), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
// Salva le credenziali ottenute come preferisci. In questo caso utilizziamo un database
db.saveCredentials(data.access_token, data.refresh_token, data.expires_in);
});Con curl:
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "grant_type=refresh_token" \
-d "refresh_token=YOUR_REFRESH_TOKEN" \
https://accounts.riseact.org/oauth/token/Fonte: https://dev.riseact.org/docs/partner-apps/oauth-authentication. Copia automatica da dev.riseact.org: non modificare qui, le modifiche vanno fatte sulla documentazione Docusaurus.