telegram_authorizer/authorizer/
embedded.rs1use crate::error::AuthError;
2
3use super::{authorize, Authorizer, User};
4use ring::hmac;
5use serde::Deserialize;
6
7#[derive(Clone)]
8pub struct Embedded(hmac::Key);
9
10#[derive(Debug, Deserialize)]
11struct EmbeddedUser {
12 user: String,
13}
14
15impl TryFrom<EmbeddedUser> for User {
16 type Error = serde_json::Error;
17 fn try_from(value: EmbeddedUser) -> Result<Self, Self::Error> {
18 let user = serde_json::from_str(&value.user)?;
19 Ok(user)
20 }
21}
22
23impl Embedded {
24 pub fn new(bot_token: &str) -> Self {
25 let key = hmac::Key::new(hmac::HMAC_SHA256, b"WebAppData");
26 let tag = hmac::sign(&key, bot_token.as_bytes());
27 Self(hmac::Key::new(hmac::HMAC_SHA256, tag.as_ref()))
28 }
29}
30
31impl Authorizer for Embedded {
32 fn authorize(&self, query_string: Option<&str>) -> Result<User, AuthError> {
33 let embedder_user: EmbeddedUser = authorize(query_string, &self.0)?;
34 serde_json::from_str(&embedder_user.user).map_err(|_| AuthError::InvalidUserJson)
35 }
36}