pub fn parse_timestamp(
value: &Value,
field_name: &str,
) -> Result<OffsetDateTime, ClaimsError>Expand description
Helper to parse timestamp (seconds since epoch) into OffsetDateTime.
ยงErrors
Returns ClaimsError::InvalidClaimFormat if the value is not a valid unix timestamp.
Examples found in repository?
examples/dispatcher_usage.rs (line 41)
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 }