use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OAuthClient {
pub client_id: String,
pub client_secret: String,
pub client_name: String,
pub redirect_uris: Vec<String>,
pub created_at: DateTime<Utc>,
pub client_secret_expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone)]
pub struct AuthorizationCode {
pub code: String,
pub client_id: String,
pub redirect_uri: String,
pub code_challenge: String, pub resource: Option<String>, pub scopes: Vec<String>,
pub expires_at: DateTime<Utc>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone)]
pub struct RefreshToken {
pub token: String,
pub client_id: String,
pub resource: Option<String>, pub scopes: Vec<String>,
pub expires_at: DateTime<Utc>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize)]
pub struct ClientRegistrationRequest {
pub client_name: Option<String>,
pub redirect_uris: Vec<String>,
#[serde(default)]
pub grant_types: Vec<String>,
#[serde(default)]
pub response_types: Vec<String>,
#[serde(default)]
pub scope: String,
}
#[derive(Debug, Serialize)]
pub struct ClientRegistrationResponse {
pub client_id: String,
pub client_secret: String,
pub client_name: String,
pub redirect_uris: Vec<String>,
pub client_secret_expires_at: i64, pub grant_types: Vec<String>,
pub response_types: Vec<String>,
}
#[derive(Debug, Deserialize)]
pub struct AuthorizeRequest {
pub response_type: String, pub client_id: String,
pub redirect_uri: String,
pub state: Option<String>,
pub code_challenge: String, pub code_challenge_method: String, pub resource: Option<String>, pub scope: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct TokenRequest {
pub grant_type: String, pub code: Option<String>, pub redirect_uri: Option<String>, pub code_verifier: Option<String>, pub refresh_token: Option<String>, pub client_id: String,
pub client_secret: String,
pub resource: Option<String>, }
#[derive(Debug, Serialize)]
pub struct TokenResponse {
pub access_token: String,
pub token_type: String, pub expires_in: i64, pub refresh_token: Option<String>,
pub scope: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct OAuthError {
pub error: String,
pub error_description: Option<String>,
pub error_uri: Option<String>,
}
impl OAuthError {
pub fn invalid_request(description: impl Into<String>) -> Self {
Self {
error: "invalid_request".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
pub fn invalid_client(description: impl Into<String>) -> Self {
Self {
error: "invalid_client".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
pub fn invalid_grant(description: impl Into<String>) -> Self {
Self {
error: "invalid_grant".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
pub fn unauthorized_client(description: impl Into<String>) -> Self {
Self {
error: "unauthorized_client".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
pub fn unsupported_grant_type(description: impl Into<String>) -> Self {
Self {
error: "unsupported_grant_type".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
pub fn invalid_scope(description: impl Into<String>) -> Self {
Self {
error: "invalid_scope".to_string(),
error_description: Some(description.into()),
error_uri: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessTokenClaims {
pub sub: String, pub aud: Option<String>, pub exp: i64, pub iat: i64, pub iss: String, pub scope: String, pub client_id: String,
}