ws_auth/oauth2/token/
mod.rs

1use chrono::{DateTime, Utc};
2use uuid::Uuid;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub enum GrantType {
6    #[serde(rename = "refresh_token")]
7    RefreshToken,
8
9    #[serde(rename = "authorization_code")]
10    AuthorizationCode,
11}
12
13#[derive(Debug, Serialize, Deserialize)]
14pub enum ErrorCode {
15    #[serde(rename = "invalid_request")]
16    InvalidRequest,
17
18    #[serde(rename = "invalid_grant")]
19    InvalidGrant,
20
21    #[serde(rename = "unauthorized_client")]
22    UnauthorizedClient,
23
24    #[serde(rename = "invalid_client")]
25    InvalidClient,
26
27    #[serde(rename = "unsupported_grant_type")]
28    UnsupportedGrantType,
29
30    #[serde(rename = "invalid_resource")]
31    InvalidResource,
32
33    #[serde(rename = "interaction_required")]
34    InteractionRequired,
35
36    #[serde(rename = "temporarily_unavailable")]
37    TemporarilyUnavailable,
38
39    #[serde(rename = "consent_required")]
40    ConsentRequired,
41
42    #[serde(rename = "invalid_scope")]
43    InvalidScope,
44}
45
46// https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
47#[derive(Debug, Serialize, Deserialize)]
48pub struct TokenRequest {
49    #[serde(skip_serializing_if = "Option::is_none")]
50    #[serde(default)]
51    pub client_id: Option<String>,
52
53    #[serde(skip_serializing_if = "Option::is_none")]
54    #[serde(default)]
55    pub client_secret: Option<String>,
56
57    #[serde(skip_serializing_if = "Option::is_none")]
58    #[serde(default)]
59    pub client_assertion_type: Option<String>,
60
61    #[serde(skip_serializing_if = "Option::is_none")]
62    #[serde(default)]
63    pub client_assertion: Option<String>,
64
65    #[serde(skip_serializing_if = "Option::is_none")]
66    #[serde(default)]
67    pub scope: Option<String>,
68
69    #[serde(skip_serializing_if = "Option::is_none")]
70    #[serde(default)]
71    pub code: Option<String>,
72
73    #[serde(skip_serializing_if = "Option::is_none")]
74    #[serde(default)]
75    pub redirect_uri: Option<String>,
76
77    #[serde(skip_serializing_if = "Option::is_none")]
78    #[serde(default)]
79    pub grant_type: Option<GrantType>,
80
81    #[serde(skip_serializing_if = "Option::is_none")]
82    #[serde(default)]
83    pub code_verifier: Option<String>,
84}
85
86#[derive(Debug, Serialize, Deserialize)]
87pub struct TokenErrorResponse {
88    #[serde(skip_serializing_if = "Option::is_none")]
89    #[serde(default)]
90    pub error: Option<ErrorCode>,
91
92    #[serde(skip_serializing_if = "Option::is_none")]
93    #[serde(default)]
94    pub error_description: Option<String>,
95
96    #[serde(skip_serializing_if = "Option::is_none")]
97    #[serde(default)]
98    pub error_codes: Option<Vec<u64>>,
99
100    #[serde(skip_serializing_if = "Option::is_none")]
101    #[serde(default)]
102    timestamp: Option<DateTime<Utc>>,
103
104    #[serde(skip_serializing_if = "Option::is_none")]
105    #[serde(default)]
106    trace_id: Option<String>,
107
108    #[serde(skip_serializing_if = "Option::is_none")]
109    #[serde(default)]
110    correlation_id: Option<String>,
111}
112
113impl TokenErrorResponse {
114    pub fn new() -> TokenErrorResponse {
115        let trace_id = Uuid::new_v4();
116        let correlation_id = Uuid::new_v4();
117
118        return TokenErrorResponse {
119            error: Option::None,
120            error_description: Option::None,
121            error_codes: Option::None,
122            timestamp: Some(Utc::now()),
123            trace_id: Some(trace_id.to_string()),
124            correlation_id: Some(correlation_id.to_string()),
125        };
126    }
127
128    pub fn new_with_tracking(trace_id: String, correlation_id: String) -> TokenErrorResponse {
129        return TokenErrorResponse {
130            error: Option::None,
131            error_description: Option::None,
132            error_codes: Option::None,
133            timestamp: Some(Utc::now()),
134            trace_id: Some(trace_id.to_owned()),
135            correlation_id: Some(correlation_id.to_owned()),
136        };
137    }
138}