Skip to main content

extract_string

Function extract_string 

Source
pub fn extract_string(
    value: &Value,
    field_name: &str,
) -> Result<String, ClaimsError>
Expand description

Helper to extract string from JSON value.

ยงErrors

Returns ClaimsError::MissingClaim if the value is not a string.

Examples found in repository?
examples/dispatcher_usage.rs (line 30)
26    fn normalize(&self, raw: &Value) -> Result<Claims, ClaimsError> {
27        let issuer_value = raw
28            .get("iss")
29            .ok_or_else(|| ClaimsError::MissingClaim("iss".to_owned()))?;
30        let issuer = extract_string(issuer_value, "iss")?;
31
32        let sub_value = raw
33            .get("sub")
34            .ok_or_else(|| ClaimsError::MissingClaim("sub".to_owned()))?;
35        let subject = parse_uuid_from_value(sub_value, "sub")?;
36
37        let audiences = raw.get("aud").map(extract_audiences).unwrap_or_default();
38
39        let expires_at = raw
40            .get("exp")
41            .map(|value| parse_timestamp(value, "exp"))
42            .transpose()?;
43
44        let not_before = raw
45            .get("nbf")
46            .map(|value| parse_timestamp(value, "nbf"))
47            .transpose()?;
48
49        let issued_at = raw
50            .get("iat")
51            .map(|value| parse_timestamp(value, "iat"))
52            .transpose()?;
53
54        let jwt_id = raw
55            .get("jti")
56            .and_then(|v| v.as_str())
57            .map(ToString::to_string);
58
59        let tenant_id_value = raw
60            .get("tenant_id")
61            .ok_or_else(|| ClaimsError::MissingClaim("tenant_id".to_owned()))?;
62        let tenant_id = parse_uuid_from_value(tenant_id_value, "tenant_id")?;
63
64        let permissions: Vec<Permission> = raw
65            .get("roles")
66            .and_then(Value::as_array)
67            .map(|arr| {
68                arr.iter()
69                    .filter_map(|value| value.as_str())
70                    .filter_map(|role| {
71                        if let Some(pos) = role.rfind(':') {
72                            Permission::builder()
73                                .resource_pattern(&role[..pos])
74                                .action(&role[pos + 1..])
75                                .build()
76                                .ok()
77                        } else {
78                            Permission::builder()
79                                .resource_pattern(role)
80                                .action("*")
81                                .build()
82                                .ok()
83                        }
84                    })
85                    .collect()
86            })
87            .unwrap_or_default();
88
89        Ok(Claims {
90            issuer,
91            subject,
92            audiences,
93            expires_at,
94            not_before,
95            issued_at,
96            jwt_id,
97            tenant_id,
98            permissions,
99            extras: serde_json::Map::new(),
100        })
101    }