forge
ExploreLog in

Tahinli/forge

public
0 watching
★ 0
796 bytes
1//! Session and CSRF token generation.
2
3use base64::prelude::{BASE64_URL_SAFE_NO_PAD, Engine as _};
4
5use crate::token::random_32;
6
7/// base64url(32 random bytes), used as the cookie value. The DB stores its sha256.
8pub fn new_session_token() -> String {
9 BASE64_URL_SAFE_NO_PAD.encode(random_32())
10}
11
12pub fn new_csrf_token() -> String {
13 BASE64_URL_SAFE_NO_PAD.encode(random_32())
14}
15
16#[cfg(test)]
17mod 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}