#[cfg(test)]
pub mod tests;
use std::str::FromStr;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum AuthFlow {
Implicit,
SinglePageApplication,
Hybrid,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum ResponseMode {
#[serde(rename = "query")]
Query,
#[serde(rename = "fragment")]
Fragment,
#[serde(rename = "form_post")]
FormPost,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum RequestPrompt {
#[serde(rename = "none")]
None,
#[serde(rename = "login")]
Login,
#[serde(rename = "consent")]
Consent,
#[serde(rename = "select_account")]
SelectAccount,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum ResponseType {
#[serde(rename = "none")]
None,
#[serde(rename = "code")]
Code,
#[serde(rename = "token")]
Token,
#[serde(rename = "id_token")]
IdToken,
}
impl FromStr for ResponseType {
type Err = ();
fn from_str(input: &str) -> Result<ResponseType, Self::Err> {
match input {
"none" => Ok(ResponseType::None),
"code" => Ok(ResponseType::Code),
"token" => Ok(ResponseType::Token),
"id_token" => Ok(ResponseType::IdToken),
_ => Err(()),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum AuthErrorCode {
#[serde(rename = "invalid_request")]
InvalidRequest,
#[serde(rename = "unauthorized_client")]
UnauthorizedClient,
#[serde(rename = "access_denied")]
AccessDenied,
#[serde(rename = "unsupported_response_type")]
UnsupportedResponseType,
#[serde(rename = "server_error")]
ServerError,
#[serde(rename = "temporarily_unavailable")]
TemporarilyUnavailable,
#[serde(rename = "invalid_resource")]
InvalidResource,
#[serde(rename = "login_required")]
LoginRequired,
#[serde(rename = "interaction_required")]
InteractionRequired,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AuthRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub tenant: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub response_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub redirect_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub response_mode: Option<ResponseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub prompt: Option<RequestPrompt>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub login_hint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub domain_hint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub code_challenge: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub code_challenge_method: Option<String>,
}
impl AuthRequest {
pub fn get_response_types(&self) -> Vec<ResponseType> {
let mut response_types: Vec<ResponseType> = Vec::new();
let raw_response_types_str = self.response_type.to_owned().unwrap();
let response_types_str = raw_response_types_str.split(" ");
for response_type_str in response_types_str.into_iter() {
let response_type_result: Result<ResponseType, _> =
ResponseType::from_str(response_type_str);
if response_type_result.is_ok() {
response_types.push(response_type_result.unwrap());
}
}
return response_types;
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AuthResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub access_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub token_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub expires_in: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub id_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub refresh_token: Option<String>,
#[serde(skip_serializing)]
pub callback_uri: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AuthErrorResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub error: Option<AuthErrorCode>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub error_description: Option<String>,
#[serde(skip_serializing)]
pub callback_uri: Option<String>,
}