| 1 | |
| 2 | |
| 3 | use base64::prelude::{BASE64_URL_SAFE_NO_PAD, Engine as _}; |
| 4 | |
| 5 | use crate::token::random_32; |
| 6 | |
| 7 | |
| 8 | pub fn new_session_token() -> String { |
| 9 | BASE64_URL_SAFE_NO_PAD.encode(random_32()) |
| 10 | } |
| 11 | |
| 12 | pub fn new_csrf_token() -> String { |
| 13 | BASE64_URL_SAFE_NO_PAD.encode(random_32()) |
| 14 | } |
| 15 | |
| 16 | #[cfg(test)] |
| 17 | mod tests { |
| 18 | use super::*; |
| 19 | |
| 20 | #[test] |
| 21 | fn tokens_are_unique_base64url_of_32_bytes() { |
| 22 | let a = new_session_token(); |
| 23 | let b = new_csrf_token(); |
| 24 | assert_eq!(a.len(), 43); |
| 25 | assert_eq!(b.len(), 43); |
| 26 | assert_ne!(a, b); |
| 27 | assert!( |
| 28 | a.bytes() |
| 29 | .all(|c| c.is_ascii_alphanumeric() || c == b'-' || c == b'_') |
| 30 | ); |
| 31 | } |
| 32 | } |