Skip to content

Commit 45effe4

Browse files
committed
AUTHN API Workspace
1 parent c0ee2b7 commit 45effe4

18 files changed

Lines changed: 184 additions & 20 deletions

File tree

‎content/en/labs/_overview.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ aliases:
1010
> - If you are willing to contribute human-written, production-grade, high-quality code, [your contributions are welcome](https://github.com/learning-rust/learning-rust.github.io/discussions).
1111
1212
| | Project Scope | Technology Stack | Codebase | Support |
13-
|----|----------------------------------------------------------------------|--------------------------------------------------------------------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
14-
| 01 | [RESTful API Workspace](/labs/building-a-containerized-restful-api/) | Axum, Tokio, Tower, Toasty ORM, Garde, Utoipa, Docker & PostgreSQL | [dumindu/axum](https://github.com/dumindu/axum) | [![support](https://img.shields.io/badge/Support-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=333333&labelColor=f9f9f9)](https://www.buymeacoffee.com/dumindu) |
13+
|----|----------------------------------------------------------------------|----------------------------------------------------------------------------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
14+
| 01 | [RESTful API Workspace](/labs/building-a-containerized-restful-api/) | Axum, Tokio, Tower, Toasty ORM, Garde, Utoipa, Docker & PostgreSQL | [dumindu/axum](https://github.com/dumindu/axum) | [![support](https://img.shields.io/badge/Support-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=333333&labelColor=f9f9f9)](https://www.buymeacoffee.com/dumindu) |
15+
| 02 | [AUTHN API Workspace](/labs/building-an-authentication-restful-api/) | Axum, Tokio, Tower, Toasty ORM, Garde, Argon2, Utoipa, Docker & PostgreSQL | Coming next | N/A|
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
title: Building an Authentication RESTful API
3+
slug: building-an-authentication-restful-api
4+
---
5+
6+
> [!Assignment] In this series,
7+
> We build a production-ready authentication RESTful API server application using Axum, Tokio, Tower, Serde, Toasty ORM, Argon2, Garde, Utoipa with Docker and PostgreSQL.
8+
> - [Hyper](https://github.com/hyperium/hyper), [Axum](https://github.com/tokio-rs/axum), [Tokio](https://tokio.rs) and [Tower](https://github.com/tower-rs): The most prominent HTTP server ecosystem at the time of writing.
9+
> - [Toasty ORM](https://github.com/tokio-rs/toasty): The most promising Object-Relational Mapper (ORM), built by the creators of Tokio and Axum.
10+
> - [Serde](https://github.com/serde-rs/serde) and [Utoipa](https://github.com/juhaku/utoipa): The most prominent serialization framework and OpenAPI 3.1 specification generator.
11+
> - [Garde](https://github.com/jprochazk/garde): The most promising and most feature-rich validation library in Rust at the time of writing.
12+
13+
## Database Design
14+
15+
```
16+
users user_devices user_passwords
17+
┌─────────────┬────────────┐ ┌──────────────────┬──────────────┐ ┌───────────────┬────────────────┐
18+
│ id │ uuid │ │ created_at │ ... │ │ created_at │ timestamp │
19+
│ created_at │ timestamp │ │ last_used_at │ ... │ │ updated_at │ timestamp │
20+
│ updated_at │ timestamp │ │ user_id │ uuid │ │ password_hash │ text │
21+
│ is_verified │ boolean │ │ signature_counter│ bigint │ │ user_id │ uuid │
22+
│ email │ text │ │ device_hash │ text │ └───────────────┴────────────────┘
23+
└─────────────┴────────────┘ │ credential_id │ bytea │
24+
│ public_key │ bytea │
25+
│ id │ uuid │
26+
└──────────────────┴──────────────┘
27+
28+
user_identities webauthn_challenges oauth_challenges
29+
┌─────────────────┬──────┐ ┌─────────────────┬────────────┐ ┌────────────────────┬──────┐
30+
│ created_at │ ... │ │ created_at │ ... │ │ created_at │ ... │
31+
│ user_id │ uuid │ │ expires_at │ ... │ │ expires_at │ ... │
32+
│ provider │ text │ │ user_id │ uuid │ │ pkce_code_verifier │ text │
33+
│ provider_sub_id │ text │ │ device_id │ uuid │ │ client_redirect_uri│ text │
34+
│ id │ uuid │ │ challenge_type │ text │ │ provider │ text │
35+
└─────────────────┴──────┘ │ challenge_token │ bytea │ │ flow_type │ text │
36+
└─────────────────┴────────────┘ │ state │ uuid │
37+
└────────────────────┴──────┘
38+
security_audit_logs refresh_tokens
39+
┌─────────────────┬──────────────┐ ┌─────────────────┬────────┐
40+
│ created_at │ ... │ │ created_at │ ... │
41+
│ user_id │ uuid │ │ expires_at │ ... │
42+
│ device_id │ uuid │ │ user_id │ uuid │
43+
│ ip_address │ text │ │ device_id │ uuid │
44+
│ user_agent │ text │ │ token_family_id │ uuid │
45+
│ location │ text │ │ is_revoked │ boolean│
46+
│ event_type │ text │ │ token_hash │ bytea │
47+
│ context │ text │ │ id │ uuid │
48+
│ id │ uuid │ └─────────────────┴────────┘
49+
└─────────────────┴──────────────┘
50+
```

‎data/en/labs/sidebar.yml‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@
1111
- title: Routes and Error Responses
1212
- title: Form Validation
1313
- title: OpenAPI Specification
14-
- title: What's Next?
14+
- title: What's Next?
15+
16+
- title: AUTHN API Workspace
17+
pages:
18+
- title: Building an Authentication RESTful API

‎docs/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!doctype html><html lang=en-US><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Rust Programming Language Tutorials for Everyone!"><meta name=author content="Dumindu Madunuwan"><meta name=theme-color content="#ffffff" media="(prefers-color-scheme: light)"><meta name=theme-color content="#101010" media="(prefers-color-scheme: dark)"><title>Learning Rust · Rust Programming Language Tutorials for Everyone!</title><link rel=canonical href=https://learning-rust.github.io/><link rel=stylesheet href=/assets/css/home.min.2f64b534694f7783ee00c07c45f130ef260d59af33aefe9e41a6606a53c5de38.css integrity><link href=https://learning-rust.github.io/pagefind/pagefind-component-ui.css rel=stylesheet><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script defer src=https://cloud.umami.is/script.js data-website-id=bdae094e-f156-4bf5-92d5-41e1809afd94></script><meta property="og:title" content="Learning Rust"><meta property="og:description" content="Learning Rust - Rust Programming Language Tutorials for Everyone!"><meta property="og:type" content="article"><meta property="og:url" content="https://learning-rust.github.io/"><meta property="og:image" content="https://learning-rust.github.io/og.jpg"><meta property="og:site_name" content="Learning Rust"><meta name=twitter:card content="summary_large_image"><meta name=twitter:title content="Learning Rust"><meta name=twitter:description content="Learning Rust - Rust Programming Language Tutorials for Everyone!"><meta name=twitter:image content="https://learning-rust.github.io/og.jpg"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","headline":"Learning Rust","description":"Learning Rust - Rust Programming Language Tutorials for Everyone!","image":"https:\/\/learning-rust.github.io\/og.jpg","author":{"@type":"Person","name":"Dumindu Madunuwan","url":"https:\/\/github.com\/dumindu"},"publisher":{"@type":"Organization","name":"Learning Rust","logo":{"@type":"ImageObject","url":"https:\/\/learning-rust.github.io\/"}},"dateModified":"2026-09-25T18:00:02Z","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/learning-rust.github.io\/"}}</script></head><body><div id=content-wrapper><header id=site-header><div id=site-header-logo><a href=https://learning-rust.github.io/><img height=52px src=https://learning-rust.github.io/logo.svg alt="Site Logo"></a></div><div id=site-header-actions><div id=search-box><pagefind-modal-trigger compact=true></pagefind-modal-trigger><pagefind-modal></pagefind-modal></div><div id=theme-dropdown class=dropdown><button class=dropdown-btn aria-haspopup=menu aria-label="Select the theme">
1+
<!doctype html><html lang=en-US><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Rust Programming Language Tutorials for Everyone!"><meta name=author content="Dumindu Madunuwan"><meta name=theme-color content="#ffffff" media="(prefers-color-scheme: light)"><meta name=theme-color content="#101010" media="(prefers-color-scheme: dark)"><title>Learning Rust · Rust Programming Language Tutorials for Everyone!</title><link rel=canonical href=https://learning-rust.github.io/><link rel=stylesheet href=/assets/css/home.min.2f64b534694f7783ee00c07c45f130ef260d59af33aefe9e41a6606a53c5de38.css integrity><link href=https://learning-rust.github.io/pagefind/pagefind-component-ui.css rel=stylesheet><link rel=manifest href=/manifest.json><link rel=icon href=/favicon/favicon.ico><link rel=icon href=/favicon/favicon-16x16.png sizes=16x16 type=image/png><link rel=icon href=/favicon/favicon-32x32.png sizes=32x32 type=image/png><link rel=apple-touch-icon href=/favicon/apple-touch-icon.png sizes=180x180><script defer src=https://cloud.umami.is/script.js data-website-id=bdae094e-f156-4bf5-92d5-41e1809afd94></script><meta property="og:title" content="Learning Rust"><meta property="og:description" content="Learning Rust - Rust Programming Language Tutorials for Everyone!"><meta property="og:type" content="article"><meta property="og:url" content="https://learning-rust.github.io/"><meta property="og:image" content="https://learning-rust.github.io/og.jpg"><meta property="og:site_name" content="Learning Rust"><meta name=twitter:card content="summary_large_image"><meta name=twitter:title content="Learning Rust"><meta name=twitter:description content="Learning Rust - Rust Programming Language Tutorials for Everyone!"><meta name=twitter:image content="https://learning-rust.github.io/og.jpg"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","headline":"Learning Rust","description":"Learning Rust - Rust Programming Language Tutorials for Everyone!","image":"https:\/\/learning-rust.github.io\/og.jpg","author":{"@type":"Person","name":"Dumindu Madunuwan","url":"https:\/\/github.com\/dumindu"},"publisher":{"@type":"Organization","name":"Learning Rust","logo":{"@type":"ImageObject","url":"https:\/\/learning-rust.github.io\/"}},"dateModified":"2026-09-30T12:11:25Z","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/learning-rust.github.io\/"}}</script></head><body><div id=content-wrapper><header id=site-header><div id=site-header-logo><a href=https://learning-rust.github.io/><img height=52px src=https://learning-rust.github.io/logo.svg alt="Site Logo"></a></div><div id=site-header-actions><div id=search-box><pagefind-modal-trigger compact=true></pagefind-modal-trigger><pagefind-modal></pagefind-modal></div><div id=theme-dropdown class=dropdown><button class=dropdown-btn aria-haspopup=menu aria-label="Select the theme">
22
<span><svg class="icon" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-96q-79 0-149-30t-122.5-82.5T126-331 96-480q0-80 30.5-149.5t84-122 125-82.5T488-864q78 0 146.5 27T754-763t80.5 110T864-518q0 96-67 163t-163 67h-68q-8 0-14 5t-6 13q0 15 15 25t15 53q0 37-27 66.5T480-96zm0-384zm-173.5 18.5Q324-479 324-504t-17.5-42.5T264-564t-42.5 17.5T204-504t17.5 42.5T264-444t42.5-17.5zm120-144Q444-623 444-648t-17.5-42.5T384-708t-42.5 17.5T324-648t17.5 42.5T384-588t42.5-17.5zm192 0Q636-623 636-648t-17.5-42.5T576-708t-42.5 17.5T516-648t17.5 42.5T576-588t42.5-17.5zm120 144Q756-479 756-504t-17.5-42.5T696-564t-42.5 17.5T636-504t17.5 42.5T696-444t42.5-17.5zM480-168q11 0 17.5-8.5T504-192q0-16-15-28t-15-50 26.5-64 64.5-26h69q66 0 112-46t46-112q0-115-88.5-194.5T488-792q-134 0-227 91t-93 221 91 221 221 91z"/></svg>
33
</span><span><svg class="icon" height="20" viewBox="0 -960 960 960" width="20"><path d="m480-246 85.91-85.91Q577-343 591.5-343t25.5 11 11 25.5-10.93 25.43L505-169q-5.4 5-11.7 7.5t-13.5 2.5-13.5-2.5T455-169L342.93-281.07Q332-292 332.5-306.5T344-332t25.5-11 25.47 11.09L480-246zm0-468-85.91 85.91Q383-617 368.5-617T343-628t-11-25.5 10.93-25.43L455-791q5.4-5 11.7-7.5t13.5-2.5 13.5 2.5T505-791l112.07 112.07Q628-668 628-654t-11 25-25.5 11-25.59-10.97L480-714z"/></svg></span></button><ul role=menu class=dropdown-menu><li role=menuitem><button title=Light class=color-scheme data-value=light style=background:#fff;color:#000>
44
<span style=color:#000>Aa</span></button></li><li role=menuitem><button title=dark class=color-scheme data-value=dark style=background:#101010;color:#fff>

‎docs/index.xml‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,22 @@
3131
&lt;/span&gt;
3232
&lt;/div&gt;
3333
&lt;div class="alert-body"&gt;
34-
&lt;p&gt;We build a production-ready containerized RESTful API server application using Axum, Tokio, Tower, Serde, Toasty ORM, Garde, Utoipa with Docker and PostgreSQL.&lt;/p&gt;</description></item><item><title>Cargo, Crates and Basic Project Structure</title><link>https://learning-rust.github.io/docs/cargo-crates-and-basic-project-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learning-rust.github.io/docs/cargo-crates-and-basic-project-structure/</guid><description>&lt;h2 id="cargo"&gt;Cargo&lt;/h2&gt;
34+
&lt;p&gt;We build a production-ready containerized RESTful API server application using Axum, Tokio, Tower, Serde, Toasty ORM, Garde, Utoipa with Docker and PostgreSQL.&lt;/p&gt;</description></item><item><title>Building an Authentication RESTful API</title><link>https://learning-rust.github.io/labs/building-an-authentication-restful-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learning-rust.github.io/labs/building-an-authentication-restful-api/</guid><description>&lt;div class="alert alert-assignment"&gt;
35+
&lt;div class="alert-header"&gt;
36+
37+
38+
39+
&lt;svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"&gt;&lt;path d="M216-144q-29.7 0-50.85-21.15Q144-186.3 144-216v-528q0-29.7 21.15-50.85Q186.3-816 216-816h171q8-31 33.5-51.5T480-888q34 0 59.5 20.5T573-816h171q29.7 0 50.85 21.15Q816-773.7 816-744v528q0 29.7-21.15 50.85Q773.7-144 744-144H216Zm0-72h528v-528H216v528Zm108-72h216q15.3 0 25.65-10.29Q576-308.58 576-323.79t-10.35-25.71Q555.3-360 540-360H324q-15.3 0-25.65 10.29Q288-339.42 288-324.21t10.35 25.71Q308.7-288 324-288Zm0-156h312q15.3 0 25.65-10.29Q672-464.58 672-479.79t-10.35-25.71Q651.3-516 636-516H324q-15.3 0-25.65 10.29Q288-495.42 288-480.21t10.35 25.71Q308.7-444 324-444Zm0-156h312q15.3 0 25.65-10.29Q672-620.58 672-635.79t-10.35-25.71Q651.3-672 636-672H324q-15.3 0-25.65 10.29Q288-651.42 288-636.21t10.35 25.71Q308.7-600 324-600Zm173-175q7-7 7-17t-7-17q-7-7-17-7t-17 7q-7 7-7 17t7 17q7 7 17 7t17-7ZM216-216v-528 528Z"/&gt;&lt;/svg&gt;
40+
41+
42+
&lt;span&gt;
43+
44+
In this series,
45+
46+
&lt;/span&gt;
47+
&lt;/div&gt;
48+
&lt;div class="alert-body"&gt;
49+
&lt;p&gt;We build a production-ready authentication RESTful API server application using Axum, Tokio, Tower, Serde, Toasty ORM, Argon2, Garde, Utoipa with Docker and PostgreSQL.&lt;/p&gt;</description></item><item><title>Cargo, Crates and Basic Project Structure</title><link>https://learning-rust.github.io/docs/cargo-crates-and-basic-project-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learning-rust.github.io/docs/cargo-crates-and-basic-project-structure/</guid><description>&lt;h2 id="cargo"&gt;Cargo&lt;/h2&gt;
3550
&lt;p&gt;Cargo is Rust’s built-in package manager and build system. It also supports the following actions,&lt;/p&gt;
3651
&lt;table&gt;
3752
&lt;thead&gt;
@@ -905,6 +920,13 @@ However, it&amp;rsquo;s good practice to specify the type on variables when usin
905920
&lt;td&gt;&lt;a href="https://github.com/dumindu/axum" target="_blank" &gt;dumindu/axum&lt;/a&gt;&lt;/td&gt;
906921
&lt;td&gt;&lt;a href="https://www.buymeacoffee.com/dumindu" target="_blank" &gt;&lt;img src="https://img.shields.io/badge/Support-FFDD00?style=for-the-badge&amp;amp;logo=buymeacoffee&amp;amp;logoColor=333333&amp;amp;labelColor=f9f9f9" alt="support"&gt;&lt;/a&gt;&lt;/td&gt;
907922
&lt;/tr&gt;
923+
&lt;tr&gt;
924+
&lt;td&gt;02&lt;/td&gt;
925+
&lt;td&gt;&lt;a href="https://learning-rust.github.io/labs/building-an-authentication-restful-api/" &gt;AUTHN API Workspace&lt;/a&gt;&lt;/td&gt;
926+
&lt;td&gt;Axum, Tokio, Tower, Toasty ORM, Garde, Argon2, Utoipa, Docker &amp;amp; PostgreSQL&lt;/td&gt;
927+
&lt;td&gt;Coming next&lt;/td&gt;
928+
&lt;td&gt;N/A&lt;/td&gt;
929+
&lt;/tr&gt;
908930
&lt;/tbody&gt;
909931
&lt;/table&gt;</description></item><item><title>Ownership</title><link>https://learning-rust.github.io/docs/ownership/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learning-rust.github.io/docs/ownership/</guid><description>&lt;p&gt;We discussed in the &lt;a href="https://learning-rust.github.io/docs/traits/#derive-traits" &gt;Derive Traits&lt;/a&gt;, the usage of &lt;a href="https://doc.rust-lang.org/std/marker/trait.Copy.html" target="_blank" &gt;&lt;code&gt;Copy&lt;/code&gt; marker trait&lt;/a&gt; and &lt;a href="https://doc.rust-lang.org/std/clone/index.html" target="_blank" &gt;&lt;code&gt;.clone()&lt;/code&gt;&lt;/a&gt; with the below code.&lt;/p&gt;
910932

0 commit comments

Comments
 (0)