Files
projectmycelium/src/config/oauth.rs
2025-09-01 21:37:01 -04:00

66 lines
1.9 KiB
Rust

use oauth2::{basic::BasicClient, AuthUrl, ClientId, ClientSecret, RedirectUrl, TokenUrl};
use serde::{Deserialize, Serialize};
use crate::config::get_app_config;
/// Gitea OAuth configuration
#[derive(Clone, Debug)]
pub struct GiteaOAuthConfig {
/// OAuth client
pub client: BasicClient,
/// Gitea instance URL
pub instance_url: String,
}
impl GiteaOAuthConfig {
/// Creates a new Gitea OAuth configuration
pub fn new() -> Self {
// Get configuration from centralized ConfigurationBuilder
let config = get_app_config();
let client_id = config.gitea_client_id()
.expect("Missing GITEA_CLIENT_ID environment variable").to_string();
let client_secret = config.gitea_client_secret()
.expect("Missing GITEA_CLIENT_SECRET environment variable").to_string();
let instance_url = config.gitea_instance_url()
.expect("Missing GITEA_INSTANCE_URL environment variable").to_string();
// Create OAuth client
let auth_url = format!("{}/login/oauth/authorize", instance_url);
let token_url = format!("{}/login/oauth/access_token", instance_url);
let client = BasicClient::new(
ClientId::new(client_id),
Some(ClientSecret::new(client_secret)),
AuthUrl::new(auth_url).unwrap(),
Some(TokenUrl::new(token_url).unwrap()),
)
.set_redirect_uri(
RedirectUrl::new(format!(
"{}/auth/gitea/callback",
config.app_url()
))
.unwrap(),
);
Self {
client,
instance_url,
}
}
}
/// Gitea user information structure
#[derive(Debug, Deserialize, Serialize)]
pub struct GiteaUser {
/// User ID
pub id: i64,
/// Username
pub login: String,
/// Full name
pub full_name: String,
/// Email address
pub email: String,
/// Avatar URL
pub avatar_url: String,
}