use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
use rand::{distr::Alphanumeric, rng, Rng};
use sha2::{Digest, Sha256};
#[derive(Debug, Clone)]
pub struct Pkce {
pub code_verifier: String,
pub code_challenge: String,
}
impl Pkce {
pub fn new() -> Self {
let code_verifier: String = rng()
.sample_iter(&Alphanumeric)
.take(64)
.map(char::from)
.collect();
let mut hasher = Sha256::new();
hasher.update(code_verifier.as_bytes());
let hash = hasher.finalize();
let code_challenge = URL_SAFE_NO_PAD.encode(hash);
Self {
code_verifier,
code_challenge,
}
}
}
impl Default for Pkce {
fn default() -> Self {
Self::new()
}
}