1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use Future;
use ;
use async_trait;
use Deserialize;
use Error;
/// Credentials comming from the login request
/// Loads the users by their credentials
/// # Example
/// ```no_run
/// use authfix::login::{LoginToken, LoadUserByCredentials, LoadUserError};
/// struct User {
/// name: String,
/// }
///
/// struct AuthenticationService;
///
/// impl LoadUserByCredentials for AuthenticationService {
/// type User = User;
///
/// async fn load_user(&self, login_token: &LoginToken) -> Result<Self::User, LoadUserError> {
/// // Currently Authfix does not provide hashing functions, you can use for example https://docs.rs/argon2/latest/argon2/
/// // This is a simplified example:
/// if login_token.email == "test@example.org" && login_token.password == "password" {
/// Ok(User {
/// name: "Johnny".to_owned(),
/// })
/// } else {
/// Err(LoadUserError::LoginFailed)
/// }
/// }
/// }
/// ```
/// This trait is called, if the login was successful
///
/// # Example
/// ```no_run
/// use authfix::async_trait;
/// use actix_web::HttpRequest;
/// use authfix::login::HandlerError;
/// use authfix::login::SuccessHandler;
/// struct MySuccessHandler;
/// struct YourUser;
///
/// #[async_trait(?Send)]
/// impl SuccessHandler for MySuccessHandler {
/// type User = YourUser;
/// async fn on_success(&self, user: &Self::User, req: HttpRequest) -> Result<(), HandlerError> {
/// // do something meaningful
/// Ok(())
/// }
/// }
/// ```
/// This trait is called, if the login failed
///
/// # Example
/// ```no_run
/// use authfix::async_trait;
/// use actix_web::HttpRequest;
/// use authfix::login::HandlerError;
/// use authfix::login::FailureHandler;
/// struct MyFailureHandler;
///
/// #[async_trait(?Send)]
/// impl FailureHandler for MyFailureHandler {
/// async fn on_failure(&self, req: HttpRequest) -> Result<(), HandlerError> {
/// // do something meaningful
/// Ok(())
/// }
/// }
/// ```