facebook_signed_request/
fb_login_deauth_callback.rs

1//! [Official doc](https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/#deauth-callback)
2
3use chrono::{serde::ts_seconds, DateTime, Utc};
4use serde::Deserialize;
5use serde_aux::field_attributes::deserialize_number_from_string;
6
7use crate::ParseError;
8
9#[derive(Deserialize, Debug, Clone)]
10pub struct Payload {
11    #[serde(deserialize_with = "deserialize_number_from_string")]
12    pub user_id: u64,
13    pub algorithm: String,
14    #[serde(with = "ts_seconds")]
15    pub issued_at: DateTime<Utc>,
16}
17impl crate::Payload for Payload {
18    fn algorithm(&self) -> Option<&str> {
19        Some(&self.algorithm)
20    }
21}
22
23pub fn parse(signed_request: &str, app_secret: &str) -> Result<Payload, ParseError> {
24    crate::parse(signed_request, app_secret)
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    #[test]
32    fn test_de() {
33        let json = r#"{"user_id":"0","algorithm":"HMAC-SHA256","issued_at":1624244156}"#;
34
35        match serde_json::from_str::<Payload>(json) {
36            Ok(payload) => {
37                assert_eq!(payload.user_id, 0);
38                assert_eq!(payload.algorithm, "HMAC-SHA256");
39                assert_eq!(payload.issued_at.timestamp(), 1624244156);
40            }
41            Err(err) => panic!("{}", err),
42        }
43    }
44}