use crate::{RemoteError, RemoteResult as Result};
use serde::{Deserialize, Serialize};
use signer_core::SignerError;
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum AuthCodeStatus {
Pending,
Fetched,
Expired,
Completed,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthCodeDetail {
pub code: String,
pub state: String,
pub status: AuthCodeStatus,
pub expire_at: i64,
pub jwt: Option<String>,
}
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct PostAuthRequest {
#[serde(rename = "jwt")]
pub jwt: String,
#[serde(rename = "state")]
pub state: String,
}
impl PostAuthRequest {
pub fn new(jwt: String, state: String) -> PostAuthRequest {
PostAuthRequest { jwt, state }
}
}
pub struct SignerRemoteAuth {
pub base_url: String,
}
impl SignerRemoteAuth {
pub fn from_url(url: String) -> Self {
Self { base_url: url }
}
pub async fn get_auth_detail(&self, target: &str) -> Result<AuthCodeDetail> {
let client = reqwest::Client::new();
let response = client.get(target).send().await?;
if !response.status().is_success() {
return Err(RemoteError::Signer(SignerError::Msg(
format!("获取认证详情失败: {}", response.status()),
)));
}
let detail: AuthCodeDetail = response.json().await?;
Ok(detail)
}
pub async fn post_auth(
&self,
target: String,
state: String,
jwt: String,
) -> Result<()> {
let request = PostAuthRequest::new(jwt, state);
let client = reqwest::Client::new();
let response = client.post(&target).json(&request).send().await?;
if !response.status().is_success() {
return Err(RemoteError::Signer(SignerError::Msg(
format!("认证请求失败: {}", response.status()),
)));
}
Ok(())
}
}