auths_cli/services/providers/
github.rs1use anyhow::{Context, Result};
2
3use super::{ClaimContext, PlatformAuth, PlatformClaimProvider};
4use crate::services::{gist, oauth, platform_claim};
5
6pub struct GitHubProvider;
7
8impl PlatformClaimProvider for GitHubProvider {
9 fn platform_name(&self) -> &'static str {
10 "github"
11 }
12
13 fn authenticate_and_publish(&self, ctx: &ClaimContext) -> Result<PlatformAuth> {
14 let rt = tokio::runtime::Runtime::new().context("failed to create async runtime")?;
15
16 let auth = rt
17 .block_on(oauth::github_device_flow(ctx.http_client, ctx.out))
18 .context("GitHub authentication failed")?;
19
20 let claim_json = platform_claim::create_signed_platform_claim(
21 "github",
22 &auth.username,
23 ctx.controller_did,
24 ctx.key_alias,
25 ctx.passphrase_provider,
26 )?;
27
28 let proof_url = rt
29 .block_on(gist::publish_proof_gist(
30 ctx.http_client,
31 &auth.access_token,
32 &claim_json,
33 ))
34 .context("failed to publish proof Gist")?;
35
36 ctx.out.print_success(&format!(
37 "Published proof Gist: {}",
38 ctx.out.info(&proof_url)
39 ));
40
41 Ok(PlatformAuth {
42 username: auth.username,
43 proof_url,
44 })
45 }
46}