Effettuare chiamate API tramite GitHub App

di Matteo Tumiati, in DevOps,

Una GitHub GitHub App è sistema sicuro progettato per permettere a servizi, automazioni e applicazioni esterne di interagire con GitHub tramite API e webhook. A differenza dei classici token, che sono per loro natura personali e associati a un utente, una GitHub App possiede una propria identità, con permessi granulari configurabili e token temporanei generati dinamicamente. Questo approccio consente di limitare l'accesso solo alle funzionalità realmente necessarie, migliorando sicurezza, tracciabilità e gestione degli accessi, soprattutto in contesti enterprise.

La GitHub App è creata da un utente, ma può essere associata a qualsiasi repository o organizzazione aziendale. Una volta creata, possiamo applicare una configurazione per decidere i permessi e le autorizzazioni,inoltre abbiamo a disposizione una serie di credenziali, tra cui un client ID, un client secret e una chiave privata. Questi elementi sono fondamentali per autenticare la nostra app e generare token di accesso temporanei, che ci permetteranno di interagire con le API di GitHub in modo sicuro e controllato.

$client_id = "<app-id>"
$private_key_path = "<private-key>.pem"

$header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
  alg = "RS256"
  typ = "JWT"
}))).TrimEnd('=').Replace('+', '-').Replace('/', '_');

$payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
  iat = [System.DateTimeOffset]::UtcNow.AddSeconds(-10).ToUnixTimeSeconds()
  exp = [System.DateTimeOffset]::UtcNow.AddMinutes(10).ToUnixTimeSeconds()
  iss = $client_id
}))).TrimEnd('=').Replace('+', '-').Replace('/', '_');

$rsa = [System.Security.Cryptography.RSA]::Create()
$rsa.ImportFromPem((Get-Content $private_key_path -Raw))

$signature = [Convert]::ToBase64String($rsa.SignData([System.Text.Encoding]::UTF8.GetBytes("$header.$payload"), [System.Security.Cryptography.HashAlgorithmName]::SHA256, [System.Security.Cryptography.RSASignaturePadding]::Pkcs1)).TrimEnd('=').Replace('+', '-').Replace('/', '_')
$jwt = "$header.$payload.$signature"

Con questo algoritmo di PowerShell abbiamo semplicemente creato un token JWT che rappresenta l'identità della GitHub App ed è firmato con la chiave privata dell'app stessa. Questo token può essere utilizzato per autenticare le richieste API e ottenere un token di accesso temporaneo, che a sua volta consente di interagire con GitHub in modo sicuro e controllato, rispettando i permessi configurati per l'app.

$app_token = "<jwt-token>"
$installation_id = "<installation-id>"

$headers = @{
    Authorization = "Bearer $JWT"
    Accept        = "application/vnd.github+json"
}

$response = Invoke-RestMethod `
    -Method POST `
    -Uri "https://api.github.com/app/installations/$installation_id/access_tokens" `
    -Headers $headers

$token = $response.token

Attenzione poiché l'endpoint da chiamare dipende dall'istanza. Su repository pubblici di GitHub, è effettivamente api.github.com, tuttavia può essere diverso se lavoriamo con una istanza Server o Enterprise Cloud: in questo caso, è necessario sostituire l'URL con quello specifico della nostra istanza, ad esempio api..ghe.com.

Ottenuto quindi il token di accesso, in base ai permessi configurati per la nostra app, potremo interagire con le API di GitHub per eseguire operazioni come leggere o scrivere dati nei repository, gestire issue, creare pull request e molto altro, sempre in modo sicuro e controllato.

git clone https://<token>@github.com/<owner>/<repo>.git

Commenti

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi