Skip to main content

auths_cli/services/providers/
github.rs

1use 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}