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.tokenAttenzione 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.
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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Raggruppamento degli aggiornamenti di dipendenze tra directory in un monorepo con Dependabot
Gestione dei codeowners in GitHub
Nuove validazioni Form Blazor
Effettuare un clone parziale di un repository di GitHub
Evitare la compressione degli artefatti in un workflow di GitHub
Operazioni tra insiemi di array in Javascript
Eseguire i pre-commit hook di git con dependabot
Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi
Utilizzare il Null conditional assignment di C# 14
Disabilitare la telemetria nella CLI di GitHub
Ciclo di vita risorse con .NET Aspire


