http_auth_basic/
lib.rs

1//! # http_auth_basic
2//!
3//! HTTP Basic Authentication Scheme (RFC 7617 base64-encoded credentials) for Rust applications
4//!
5//! # Example
6//!
7//! Decoding a basic authorization value and creating a `Credentials` struct
8//! from it
9//!
10//! ```
11//! use http_auth_basic::Credentials;
12//!
13//! let auth_header_value = String::from("Basic dXNlcm5hbWU6cGFzc3dvcmQ=");
14//! let credentials = Credentials::from_header(auth_header_value).unwrap();
15//!
16//! assert_eq!(credentials.user_id, String::from("username"));
17//! assert_eq!(credentials.password, String::from("password"));
18//! ```
19//!
20//! Encoding `Credentials` into a basic authorization header value.
21//!
22//! ```
23//! use http_auth_basic::Credentials;
24//!
25//! let credentials = Credentials::new("username", "password");
26//! let credentials = credentials.as_http_header();
27//!
28//! assert_eq!(String::from("Basic dXNlcm5hbWU6cGFzc3dvcmQ="), credentials);
29//! ```
30//!
31mod credentials;
32mod error;
33
34pub use credentials::*;
35pub use error::*;
36
37#[cfg(test)]
38mod tests {
39    use std::str::FromStr;
40
41    use super::*;
42
43    #[test]
44    fn it_creates_credentials_from_value() {
45        let auth_header_value = String::from("dXNlcm5hbWU6cGFzc3dvcmQ=");
46        let credentials = Credentials::decode(auth_header_value).unwrap();
47
48        assert_eq!(credentials.user_id, String::from("username"));
49        assert_eq!(credentials.password, String::from("password"));
50    }
51
52    #[test]
53    fn it_creates_credentials_from_value_with_colon() {
54        let auth_header_value = String::from("dXNlcm5hbWU6OnBhc3M6d29yZDo=");
55        let credentials = Credentials::decode(auth_header_value).unwrap();
56
57        assert_eq!(credentials.user_id, String::from("username"));
58        assert_eq!(credentials.password, String::from(":pass:word:"));
59    }
60
61    #[test]
62    fn it_encodes_credentials() {
63        let credentials = Credentials::new("username", "password");
64        let credentials = credentials.encode();
65
66        assert_eq!(String::from("dXNlcm5hbWU6cGFzc3dvcmQ="), credentials);
67    }
68
69    #[test]
70    fn it_creates_credentials_from_header_value() {
71        let auth_header_value = String::from("Basic dXNlcm5hbWU6cGFzc3dvcmQ=");
72        let credentials = Credentials::from_header(auth_header_value).unwrap();
73
74        assert_eq!(credentials.user_id, String::from("username"));
75        assert_eq!(credentials.password, String::from("password"));
76    }
77
78    #[test]
79    fn it_creates_credentials_from_header_value_with_colon() {
80        let auth_header_value = String::from("Basic dXNlcm5hbWU6OnBhc3M6d29yZDo=");
81        let credentials = Credentials::from_header(auth_header_value).unwrap();
82
83        assert_eq!(credentials.user_id, String::from("username"));
84        assert_eq!(credentials.password, String::from(":pass:word:"));
85    }
86
87    #[test]
88    fn it_creates_header_value() {
89        let credentials = Credentials::new("username", "password");
90        let credentials = credentials.as_http_header();
91
92        assert_eq!(String::from("Basic dXNlcm5hbWU6cGFzc3dvcmQ="), credentials);
93    }
94
95    #[test]
96    fn it_creates_header_value_with_colon() {
97        let credentials = Credentials::new("username", ":pass:word:");
98        let credentials = credentials.as_http_header();
99
100        assert_eq!(
101            String::from("Basic dXNlcm5hbWU6OnBhc3M6d29yZDo="),
102            credentials
103        );
104    }
105
106    #[test]
107    fn it_creates_credentials_from_str_value() {
108        let auth_header_value_str = "dXNlcm5hbWU6cGFzc3dvcmQ=";
109        let credentials = Credentials::from_str(auth_header_value_str).unwrap();
110
111        assert_eq!(credentials.user_id, String::from("username"));
112        assert_eq!(credentials.password, String::from("password"));
113    }
114
115    #[test]
116    fn it_creates_credentials_from_str_header() {
117        let auth_header_str = "Basic dXNlcm5hbWU6cGFzc3dvcmQ=";
118        let credentials = Credentials::from_str(auth_header_str).unwrap();
119
120        assert_eq!(credentials.user_id, String::from("username"));
121        assert_eq!(credentials.password, String::from("password"));
122    }
123
124    #[test]
125    fn from_header_returns_err_when_input_has_no_whitespace() {
126        let auth_header_value = String::from("BasicdXNlcm5hbWU6OnBhc3M6d29yZDo=");
127        let credentials = Credentials::from_header(auth_header_value);
128
129        assert!(credentials.is_err());
130    }
131
132    #[test]
133    fn from_header_returns_err_when_input_contains_multiple_whitespaces() {
134        let auth_header_value = String::from("Basic dXNlcm5hbWU6On Bhc3M6d29yZDo=");
135        let credentials = Credentials::from_header(auth_header_value);
136
137        assert!(credentials.is_err());
138    }
139
140    #[test]
141    fn from_header_returns_err_when_input_is_not_basic_auth() {
142        let auth_header_value = String::from("Bearer dXNlcm5hbWU6OnBhc3M6d29yZDo=");
143        let credentials = Credentials::from_header(auth_header_value);
144
145        assert!(credentials.is_err());
146    }
147
148    #[test]
149    fn decode_returns_err_when_input_has_no_colons() {
150        // base64::encode("usernamepassword") = "dXNlcm5hbWVwYXNzd29yZA==""
151        let auth_header_value = String::from("dXNlcm5hbWVwYXNzd29yZA==");
152        let credentials = Credentials::from_header(auth_header_value);
153
154        assert!(credentials.is_err());
155    }
156}