Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Passkey_OAuth2-Osaki-rs-20250325.pdf
Search
ktaka-ccmp
March 25, 2025
66
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Passkey_OAuth2-Osaki-rs-20250325.pdf
ktaka-ccmp
March 25, 2025
More Decks by ktaka-ccmp
See All by ktaka-ccmp
RustでOAuth2+Passkeyのライブラリを作ってます
ktaka8ccmp
0
22
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
210
A designer walks into a library…
pauljervisheath
211
24k
Code Review Best Practice
trishagee
74
20k
Thoughts on Productivity
jonyablonski
76
5.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
RailsConf 2023
tenderlove
30
1.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Transcript
RustでOAuth2/OIDC+Passkey 認証をやってます。 @ktaka GitHub
自己紹介 • X: @ktaka • Rust一年生 • リスキリング中の自営業者 • あまり登壇に慣れていない
お手柔らかにお願いします。 GitHub
内容 • 以下のものをRust(Axum)で実装しています ◦ Google OAuth2/OIDCでログインする機能 ◦ Passkeyでログインする機能 • Agenda
◦ デモ ◦ OAuth2、Passkeyおさらい ◦ 作ったものの使い方 GitHub
まずはデモから • Passkeyでアカウント作成 • 再ログイン • Passkey追加 • 再ログイン •
OAuth2アカウント連携 • 再ログイン GitHub デモ(本日限り)
OAuth2、Passkeyのおさらい Google OAuth2 • Google OAuth2認証 • ユーザーセッション作成 • クッキーセット🍪
Passkey • パスキー認証 • ユーザーセッション作成 • クッキーセット🍪 GitHub
OAuth2/OIDC(Google) ページ遷移ベースで認証 • ログインボタン→GoogleにRedirect • ユーザーがOAuth認証を許可 • 元のサーバにcodeをPOST • id_tokenへ交換してもらう💱
• user lookup→セッション作成 • クッキー🍪セット
Passkey サインイン JavaScriptがフローを制御 • 認証Start • 認証オプション作成 • チャレンジに秘密鍵でサインしてもらう •
サーバ上の公開鍵で検証 • user lookup→セッション作成 • クッキー🍪セット 認証器 Google Password Manager、Yubikey
使い方 • Axumのルーターにネストで簡単に使える • ページ保護 ◦ handlerの引数にuserを入れる。userが取得できればログイン済み ◦ セッションクッキー有り無しをmiddlewareでチェック GitHub
使い方: Axumのルーターにネスト use auth2_passkey_axum::{ O2P_ROUTE_PREFIX, //ネスト先のPathプリフィックス oauth2_passkey_router, //ルータ is_authenticated, //ログイン判別ミドルウェア
}; let app = Router::new() .route("/", get(index)) .route("/protected", get(handler1)) .route("/protected2", get(handler2).route_layer(from_fn(is_authenticated))) .nest(O2P_ROUTE_PREFIX.as_str(), oauth2_passkey_router()); nestすれば使えるようになる
ページ保護:handlerの引数で(1) let app = Router::new() .route("/protected", get(handler1)) //axum extractorを別途定義してあり、セッションからuserをextractできます。 //userが取れないと401
async fn handler1(user: User) -> impl IntoResponse { Html(format!("Hey {}!", u.account)) } GitHub
ページ保護:handlerの引数で(2) let app = Router::new() .route("/protected", get(handler1)) //userの有りなしで動作を変える。 async fn
handler1(user: Option<User>) -> impl IntoResponse { match user { Some(u) => Html(format!("Hey {}!", u.account)), None => Html("Anonymous user!".to_string()), } } GitHub
middlewareでページ保護 let app = Router::new() .route("/protected2", get(handler2).route_layer(from_fn(is_authenticated))) //handerの引数のuserは不要 async fn
handler2() -> ... pub async fn is_authenticated(req: Request, next: Next) -> impl IntoResponse { match check_session(req.headers()).await { Ok(true) => next.run(req).await, Ok(false) | Err(_) => (StatusCode::UNAUTHORIZED, "Unauthorized").into_response(), } } 有効なセッションがあれば next、無け れば401 Unauthorized Redirectにしても良い Redirect::temporary(url).into_response()
まとめ • Rust(Axum)で実装 ◦ Google OAuth2/OIDCでログインする機能 ◦ Passkeyでログインする機能 • ルートをネストすれば利用可能
• 今後Crateとして公開します GitHub
絶賛お仕事募集中です🙇 GitHub
今後 • テスト、これから頑張ります • ドキュメント、これから頑張ります • Crateとして公開したい 需要あるでしょうか? GitHub
くふうした点、苦労した点 • stateのバケツリレーを使わずに、static変数でデータベースの接続情報を引き回 す。LazyLockで環境変数から初期化。 • すでにUserDBある場合、uidをアプリ側で関連付ける(想像) • thiserrorでモジュール毎にError typeを用意→?で解決できない、変換が大変 •
if let、unwrap_or_xxx、ok_or_xxx、?で苦しむ。全部matchで書き直そうか。 • ありがとうClaude、ありがとうWindsurf ◦ クソコードで上書きされ、こちらがデバッグすることもあります