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
|
use uuid::Uuid;
use crate::{
app::App,
clock::RequestedAt,
login::{Login, Password},
token::{
extract::{Identity, IdentityToken},
Secret,
},
};
pub fn not_logged_in() -> IdentityToken {
IdentityToken::new()
}
pub async fn logged_in(app: &App, login: &(Login, Password), now: &RequestedAt) -> IdentityToken {
let (login, password) = login;
let (_, token) = app
.tokens()
.login(&login.name, password, now)
.await
.expect("should succeed given known-valid credentials");
IdentityToken::new().set(token)
}
pub async fn from_token(app: &App, token: &IdentityToken, issued_at: &RequestedAt) -> Identity {
let secret = token.secret().expect("identity token has a secret");
let (token, login) = app
.tokens()
.validate(&secret, issued_at)
.await
.expect("always validates newly-issued secret");
Identity { token, login }
}
pub async fn identity(app: &App, login: &(Login, Password), issued_at: &RequestedAt) -> Identity {
let secret = logged_in(app, login, issued_at).await;
from_token(app, &secret, issued_at).await
}
pub fn secret(identity: &IdentityToken) -> Secret {
identity.secret().expect("identity contained a secret")
}
pub fn fictitious() -> IdentityToken {
let token = Uuid::new_v4().to_string();
IdentityToken::new().set(token)
}
|