farcaster_rs/account/auth/
generate_bearer.rs1use chrono::{DateTime, Utc};
2use ethers::{
3 prelude::k256::ecdsa::SigningKey,
4 signers::{Signer, Wallet},
5 types::Signature,
6};
7
8use crate::{
9 types::account::auth::bearer::{Bearer, Params, Payload},
10 Farcaster,
11};
12
13use serde_json::{json, Value};
14
15impl Farcaster {
16 pub async fn generate_bearer(
21 wallet: &Wallet<SigningKey>,
22 duration_secs: Option<i64>,
23 ) -> Result<Bearer, Box<dyn std::error::Error>> {
24 let dt: DateTime<Utc> = Utc::now();
26 let timestamp = dt.timestamp_millis();
27
28 let params = Params {
30 timestamp,
31 expires_at: match duration_secs {
32 Some(secs) => Some(timestamp + (secs * 1000)),
34 None => None,
36 },
37 };
38
39 let payload: Value = json!({
41 "method": "generateToken",
42 "params": params,
43 });
44
45 let signature: Signature = wallet.sign_message(payload.to_string()).await?;
47
48 let arrayify: Vec<u8> = hex::decode(signature.to_string())?;
50
51 let base64_signature: String = base64::encode(arrayify);
53
54 let bearer = format!("Bearer eip191:{}", base64_signature);
56
57 let payload = Payload {
58 method: "generateToken".to_string(),
59 params,
60 };
61
62 let bearer = Bearer { bearer, payload };
63
64 Ok(bearer)
65 }
66}