openapiv3/
security_scheme.rs

1use indexmap::IndexMap;
2use serde::{Deserialize, Serialize};
3
4/// Defines a security scheme that can be used by the operations.
5/// Supported schemes are HTTP authentication, an API key (either as a
6/// header or as a query parameter), OAuth2's common flows (implicit, password,
7/// application and access code) as defined in RFC6749, and OpenID Connect Discovery.
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
9#[serde(tag = "type")]
10pub enum SecurityScheme {
11    #[serde(rename = "apiKey")]
12    APIKey {
13        #[serde(rename = "in")]
14        location: APIKeyLocation,
15        name: String,
16        #[serde(skip_serializing_if = "Option::is_none")]
17        description: Option<String>,
18    },
19    #[serde(rename = "http")]
20    HTTP {
21        scheme: String,
22        #[serde(rename = "bearerFormat", skip_serializing_if = "Option::is_none")]
23        bearer_format: Option<String>,
24        #[serde(skip_serializing_if = "Option::is_none")]
25        description: Option<String>,
26    },
27    #[serde(rename = "oauth2")]
28    OAuth2 {
29        flows: OAuth2Flows,
30        #[serde(skip_serializing_if = "Option::is_none")]
31        description: Option<String>,
32    },
33    #[serde(rename = "openIdConnect")]
34    OpenIDConnect {
35        #[serde(rename = "openIdConnectUrl")]
36        open_id_connect_url: String,
37        #[serde(skip_serializing_if = "Option::is_none")]
38        description: Option<String>,
39    },
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
43#[serde(rename_all = "camelCase")]
44pub enum APIKeyLocation {
45    Query,
46    Header,
47    Cookie,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
51#[serde(rename_all = "camelCase")]
52pub struct OAuth2Flows {
53    #[serde(flatten)]
54    pub implicit: Option<OAuth2Flow>,
55    #[serde(flatten)]
56    pub password: Option<OAuth2Flow>,
57    #[serde(flatten)]
58    pub client_credentials: Option<OAuth2Flow>,
59    #[serde(flatten)]
60    pub authorization_code: Option<OAuth2Flow>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
64#[serde(rename_all = "camelCase")]
65pub enum OAuth2Flow {
66    #[serde(rename_all = "camelCase")]
67    Implicit {
68        authorization_url: String,
69        #[serde(skip_serializing_if = "Option::is_none")]
70        refresh_url: Option<String>,
71        #[serde(default)]
72        scopes: IndexMap<String, String>,
73    },
74    #[serde(rename_all = "camelCase")]
75    Password {
76        #[serde(skip_serializing_if = "Option::is_none")]
77        refresh_url: Option<String>,
78        token_url: String,
79        #[serde(default)]
80        scopes: IndexMap<String, String>,
81    },
82    #[serde(rename_all = "camelCase")]
83    ClientCredentials {
84        #[serde(skip_serializing_if = "Option::is_none")]
85        refresh_url: Option<String>,
86        token_url: String,
87        #[serde(default)]
88        scopes: IndexMap<String, String>,
89    },
90    #[serde(rename_all = "camelCase")]
91    AuthorizationCode {
92        authorization_url: String,
93        token_url: String,
94        #[serde(skip_serializing_if = "Option::is_none")]
95        refresh_url: Option<String>,
96        #[serde(default)]
97        scopes: IndexMap<String, String>,
98    },
99}