GitHub App a OAuth tokeny
Statické tokeny Token nikdy neexpirujú, inštalačné tokeny GitHub App a OAuth prístupové tokeny áno. GithubAppToken a OauthToken prístupový token transparentne vydajú, kešujú a obnovujú — využijú to čítania, zápisy aj dávky a tajomstvá sa pri serializácii vždy maskujú. JWT aplikácie je skutočný RS256 JWS podpísaný cez crypto-for-laravel — bez JWT knižnice tretej strany.
Inštalačné tokeny GitHub App
Aplikáciu nastavte raz v .env:
GITHUB_APP_ID=123456
GITHUB_APP_INSTALLATION_ID=7654321
GITHUB_APP_PRIVATE_KEY=/path/to/app-private-key.pem
GITHUB_APP_SLUG=acme-botKeď sú nastavené všetky tri hodnoty — id aplikácie, id inštalácie a privátny kľúč —, Git::github() vytvorí GithubAppToken automaticky; ak niektorá chýba, použije statický token, prípadne žiadne údaje. Git::credentials(ProviderName::Github) vráti tie isté údaje — ich ->accessToken() prečíta živý inštalačný token a pri prázdnej cache ho vydá. Prípadne ho vytvorte explicitne:
use RoundlyConsulting\Git\Dto\Credentials\{GithubAppToken, OauthToken};
use RoundlyConsulting\Git\Enums\ProviderName;
$github = Git::github(GithubAppToken::for(
appId: config('git.providers.github.app.id'),
installationId: config('git.providers.github.app.installation_id'),
privateKey: config('git.providers.github.app.private_key'), // PEM string or file path
));
$github->repositories(); // installation token minted, cached to expiry, reusedId aplikácie aj inštalácie musia byť číselné — čokoľvek iné vyhodí InvalidCredentialsException skôr, než by sa dostalo do kľúča cache. Používajte zdieľaný cache store (nie driver array), aby vydané tokeny prežili medzi požiadavkami.
OAuth prístupové tokeny
// The OAuth client (client_id, client_secret, token_url) is static per provider, so
// forProvider() takes it from git.providers.github.oauth.* and asks only for the
// per-user half.
$github = Git::github(OauthToken::forProvider(
ProviderName::Github,
accessToken: $access, refreshToken: $refresh, expiresAt: $expiresAt,
));
// Pass all five to OauthToken::for() to bypass config entirely.
$gitlab = Git::gitlab(OauthToken::for(
accessToken: $access,
refreshToken: $refresh,
clientId: 'your-client-id',
clientSecret: 'your-client-secret',
tokenUrl: 'https://gitlab.com/oauth/token',
expiresAt: $expiresAt,
));Ak client_id, client_secret alebo token_url nie je nastavené, forProvider() vyhodí InvalidCredentialsException s názvom chýbajúceho kľúča.
Uloženie rotovaného refresh tokenu
Ak OAuth údaje ukladáte, počúvajte OauthTokenRefreshed. Platformy, ktoré refresh tokeny rotujú, zneplatnia starý v momente, keď vydajú nový. Nový token ide do cache tokenov, ktorej záznam expiruje spolu s prístupovým tokenom — po uplynutí tej hodiny zostane jediná kópia tá, ktorú ste si uložili, a tá je už neplatná:
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Git\Events\OauthTokenRefreshed;
Event::listen(OauthTokenRefreshed::class, function (OauthTokenRefreshed $event) {
if ($event->rotated()) {
$connection->update([
'refresh_token' => $event->refreshToken,
'access_token' => $event->accessToken,
'expires_at' => $event->expiresAt,
]);
}
});Event sa spustí pri každej obnove, s rotáciou aj bez nej; rotated() je príznak, že uloženú hodnotu treba zmeniť. Event nelogujte celý — zámerne nesie živé tokeny.
Súbežné obnovy
Súbežné workery obnovujú token len raz: na cache store, ktorý podporuje zámky (Redis, databáza, súbor, array, …), beží obnova pod zámkom a worker, ktorý na ňu čakal, použije token, ktorý držiteľ zámku práve obnovil, namiesto toho, aby znova poslal už spotrebovaný refresh token — platforma s rotáciou tak porazenému v súbehu nikdy neodpovie invalid_grant a event sa spustí raz.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.