サインイン、ログイン時に、is_authenticatedをtrueに変更する設計にする。そうすることにより、ログイン前のログイン画面やサインイン画面で匿名セッションを発行して、csrf認証を行うことができる。
CREATE TABLE ares_sessions (
id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
session_token TEXT,
csrf_token TEXT,
is_authenticated BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
let parsed_form = parse(&body);
let csrf_token_from_form = parsed_form.get("csrf_token").map(|s| s.as_str());
let csrf_valid = match (&session_token, csrf_token_from_form) {
(Some(sess_token), Some(csrf_token)) => validate_csrf_token(sess_token, csrf_token),
_ => false,
};
//
pub fn validate_session_token(token: &str) -> bool {
let mut client = match psql_connect() {
Ok(c) => c,
Err(_) => return false,
};
let rows = match client.query(
"SELECT is_authenticated FROM ares_sessions WHERE session_token = $1",
&[&token],
) {
Ok(r) => r,
Err(_) => return false,
};
if rows.is_empty() {
return false;
}
let is_authenticated: bool = rows[0].get(0);
is_authenticated
}