firebase_wasm/auth/
user.rs

1use serde::Deserialize;
2use wasm_bindgen::{prelude::*, JsCast};
3
4use crate::FirebaseError;
5
6use super::AuthError;
7
8impl User {
9    pub async fn delete(&self) -> Result<(), AuthError> {
10        self.delete_js()
11            .await
12            .map_err(|err| err.unchecked_into::<FirebaseError>().into())
13    }
14
15    pub async fn get_id_token_result(&self, force_refresh: bool) -> Result<IdTokenResult, JsValue> {
16        self.get_id_token_result_js(force_refresh)
17            .await
18            .map(Into::into)
19    }
20
21    pub async fn get_id_token(&self, force_refresh: bool) -> Result<String, JsValue> {
22        self.get_id_token_js(force_refresh)
23            .await
24            .map(JsCast::unchecked_into::<js_sys::JsString>)
25            .map(|token| String::try_from(token).expect("token to be a string"))
26    }
27}
28
29impl ParsedToken {
30    pub fn custom_claims<T>(&self) -> Result<T, serde_wasm_bindgen::Error>
31    where
32        T: for<'de> Deserialize<'de>,
33    {
34        serde_wasm_bindgen::from_value::<T>(self.unchecked_ref::<JsValue>().to_owned())
35    }
36}
37
38#[wasm_bindgen(module = "firebase/auth")]
39extern "C" {
40    #[derive(Clone, Debug)]
41    #[wasm_bindgen(extends = UserInfo, typescript_type = r#"import("firebase/auth").User"#)]
42    pub type User;
43    #[derive(Clone, Debug)]
44    pub type UserMetadata;
45    #[derive(Clone, Debug)]
46    pub type UserInfo;
47    #[derive(Clone, Debug)]
48    pub type IdTokenResult;
49    #[derive(Clone, Debug)]
50    pub type ParsedToken;
51    #[derive(Clone, Debug)]
52    pub type Firebase;
53
54    // =========================================================================
55    //                                UserInfo
56    // =========================================================================
57
58    #[wasm_bindgen(method, getter, js_name = displayName)]
59    pub fn display_name(this: &UserInfo) -> Option<String>;
60
61    #[wasm_bindgen(method, getter, js_name = email)]
62    pub fn email(this: &UserInfo) -> Option<String>;
63
64    #[wasm_bindgen(method, getter, js_name = phoneNumber)]
65    pub fn phone_number(this: &UserInfo) -> Option<String>;
66
67    #[wasm_bindgen(method, getter, js_name = photoURL)]
68    pub fn photo_url(this: &UserInfo) -> Option<String>;
69
70    #[wasm_bindgen(method, getter, js_name = providerId)]
71    pub fn provider_id(this: &UserInfo) -> String;
72
73    #[wasm_bindgen(method, getter, js_name = uid)]
74    pub fn uid(this: &UserInfo) -> String;
75
76    // =========================================================================
77    //                              UserMetadata
78    // =========================================================================
79
80    #[wasm_bindgen(method, getter, js_name = creationTime)]
81    pub fn creation_time(this: &UserMetadata) -> String;
82
83    #[wasm_bindgen(method, getter, js_name = lastSignInTime)]
84    pub fn last_sign_in_time(this: &UserMetadata) -> String;
85
86    // =========================================================================
87    //                                  User
88    // =========================================================================
89
90    #[wasm_bindgen(method, getter, js_name = emailVerified)]
91    pub fn email_verified(this: &User) -> bool;
92
93    #[wasm_bindgen(method, getter, js_name = isAnonymous)]
94    pub fn is_anonymous(this: &User) -> bool;
95
96    #[wasm_bindgen(getter)]
97    pub fn metadata(this: &User) -> UserMetadata;
98
99    #[wasm_bindgen(method, getter, js_name = providerData)]
100    pub fn provider_data(this: &User) -> Vec<UserInfo>;
101
102    #[wasm_bindgen(method, getter, js_name = refreshToken)]
103    pub fn refresh_token(this: &User) -> String;
104
105    #[wasm_bindgen(method, getter, js_name = tenantId)]
106    pub fn tenant_id(this: &User) -> String;
107
108    #[wasm_bindgen(method, js_name = delete, catch)]
109    async fn delete_js(this: &User) -> Result<(), JsValue>;
110
111    #[wasm_bindgen(method, js_name = getIdToken, catch)]
112    async fn get_id_token_js(this: &User, force_refresh: bool) -> Result<JsValue, JsValue>;
113
114    #[wasm_bindgen(method, js_name = getIdTokenResult, catch)]
115    async fn get_id_token_result_js(this: &User, force_refresh: bool) -> Result<JsValue, JsValue>;
116
117    #[wasm_bindgen(method, catch)]
118    async fn reload(this: &User) -> Result<(), JsValue>;
119
120    #[wasm_bindgen(method, js_name = toJSON)]
121    pub fn to_json(this: &User) -> js_sys::Object;
122
123    // =========================================================================
124    //                              IdTokenResult
125    // =========================================================================
126
127    #[wasm_bindgen(method, getter, js_name = authTime)]
128    pub fn auth_time(this: &IdTokenResult) -> String;
129
130    #[wasm_bindgen(method, getter, js_name = expirationTime)]
131    pub fn expiration_time(this: &IdTokenResult) -> String;
132
133    #[wasm_bindgen(method, getter, js_name = issuedAtTime)]
134    pub fn issued_at_time(this: &IdTokenResult) -> String;
135
136    #[wasm_bindgen(method, getter, js_name = signInProvider)]
137    pub fn sign_in_provider(this: &IdTokenResult) -> Option<String>;
138
139    #[wasm_bindgen(method, getter, js_name = signInSecondFactor)]
140    pub fn sign_in_second_factor(this: &IdTokenResult) -> Option<String>;
141
142    #[wasm_bindgen(method, getter, js_name = token)]
143    pub fn token(this: &IdTokenResult) -> Option<String>;
144
145    #[wasm_bindgen(method, getter, js_name = claims)]
146    pub fn claims(this: &IdTokenResult) -> ParsedToken;
147
148    // =========================================================================
149    //                              ParsedToken
150    // =========================================================================
151
152    #[wasm_bindgen(method, getter)]
153    pub fn exp(this: &ParsedToken) -> Option<String>;
154
155    #[wasm_bindgen(method, getter)]
156    pub fn sub(this: &ParsedToken) -> Option<String>;
157
158    #[wasm_bindgen(method, getter)]
159    pub fn auth_time(this: &ParsedToken) -> Option<String>;
160
161    #[wasm_bindgen(method, getter)]
162    pub fn iat(this: &ParsedToken) -> Option<String>;
163
164    #[wasm_bindgen(method, getter)]
165    pub fn firebase(this: &ParsedToken) -> Option<Firebase>;
166
167    // =========================================================================
168    //                                Firebase
169    // =========================================================================
170
171    #[wasm_bindgen(method, getter)]
172    pub fn sign_in_provider(this: &Firebase) -> Option<Firebase>;
173
174    #[wasm_bindgen(method, getter)]
175    pub fn sign_in_second_factor(this: &Firebase) -> Option<Firebase>;
176
177    #[wasm_bindgen(method, getter)]
178    pub fn identities(this: &Firebase) -> Option<js_sys::Object>;
179}