aws_lambda_events/event/iot/
mod.rs

1use crate::{custom_serde::serialize_headers, encodings::Base64Data, iam::IamPolicyDocument};
2use http::HeaderMap;
3use serde::{Deserialize, Serialize};
4
5/// `IoTCoreCustomAuthorizerRequest` represents the request to an IoT Core custom authorizer.
6/// See <https://docs.aws.amazon.com/iot/latest/developerguide/config-custom-auth.html>
7#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
8#[serde(rename_all = "camelCase")]
9pub struct IoTCoreCustomAuthorizerRequest {
10    #[serde(default)]
11    pub token: Option<String>,
12    pub signature_verified: bool,
13    pub protocols: Vec<String>,
14    pub protocol_data: Option<IoTCoreProtocolData>,
15    pub connection_metadata: Option<IoTCoreConnectionMetadata>,
16}
17
18#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
19#[serde(rename_all = "camelCase")]
20pub struct IoTCoreProtocolData {
21    pub tls: Option<IoTCoreTlsContext>,
22    pub http: Option<IoTCoreHttpContext>,
23    pub mqtt: Option<IoTCoreMqttContext>,
24}
25
26#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
27#[serde(rename_all = "camelCase")]
28pub struct IoTCoreTlsContext {
29    #[serde(default)]
30    pub server_name: Option<String>,
31}
32
33#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
34#[serde(rename_all = "camelCase")]
35pub struct IoTCoreHttpContext {
36    #[serde(deserialize_with = "http_serde::header_map::deserialize", default)]
37    #[serde(serialize_with = "serialize_headers")]
38    pub headers: HeaderMap,
39    #[serde(default)]
40    pub query_string: Option<String>,
41}
42
43#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
44#[serde(rename_all = "camelCase")]
45pub struct IoTCoreMqttContext {
46    #[serde(default)]
47    pub client_id: Option<String>,
48    pub password: Base64Data,
49    #[serde(default)]
50    pub username: Option<String>,
51}
52
53#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct IoTCoreConnectionMetadata {
56    #[serde(default)]
57    pub id: Option<String>,
58}
59
60/// `IoTCoreCustomAuthorizerResponse` represents the response from an IoT Core custom authorizer.
61/// See <https://docs.aws.amazon.com/iot/latest/developerguide/config-custom-auth.html>
62#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
63#[serde(rename_all = "camelCase")]
64pub struct IoTCoreCustomAuthorizerResponse {
65    pub is_authenticated: bool,
66    #[serde(default)]
67    pub principal_id: Option<String>,
68    pub disconnect_after_in_seconds: u32,
69    pub refresh_after_in_seconds: u32,
70    pub policy_documents: Vec<Option<IamPolicyDocument>>,
71}
72
73#[cfg(test)]
74mod test {
75    use super::*;
76
77    #[test]
78    #[cfg(feature = "iot")]
79    fn example_iot_custom_auth_request() {
80        let data = include_bytes!("../../fixtures/example-iot-custom-auth-request.json");
81        let parsed: IoTCoreCustomAuthorizerRequest = serde_json::from_slice(data).unwrap();
82        let output: String = serde_json::to_string(&parsed).unwrap();
83        let reparsed: IoTCoreCustomAuthorizerRequest = serde_json::from_slice(output.as_bytes()).unwrap();
84        assert_eq!(parsed, reparsed);
85    }
86
87    #[test]
88    #[cfg(feature = "iot")]
89    fn example_iot_custom_auth_response() {
90        let data = include_bytes!("../../fixtures/example-iot-custom-auth-response.json");
91        let parsed: IoTCoreCustomAuthorizerResponse = serde_json::from_slice(data).unwrap();
92        let output: String = serde_json::to_string(&parsed).unwrap();
93        let reparsed: IoTCoreCustomAuthorizerResponse = serde_json::from_slice(output.as_bytes()).unwrap();
94        assert_eq!(parsed, reparsed);
95    }
96}