Skip to main content

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.