Posts

Showing posts from December 6, 2024

AxumでGoogle OAuth2/OIDC認証を実装する

Image
この記事は Rust Advent Calendar 2024 シリーズ2の6日目の記事です。 はじめに 概要 OAuth2とOpenID Connectとは 認証の仕組み 実装の詳細 認証フローの実装 アプリケーションの構造 メインページの実装 認証フローの開始 コールバック処理 セッション管理 セキュリティ対策の詳細 Nonceによる検証 CSRF保護 Cookieのセキュリティ レスポンスモードのセキュリティ 認可コードフローによる認証 IDトークンの検証 おわりに はじめに RustとAxumを使って、Google OAuth2でのログイン機能を実装しました。OAuth2とOIDCを使った認証は現代のWebアプリケーションでは一般的な方法です。この記事では、安全な認証システムを作るために必要な基礎知識と、具体的な実装方法を説明します。 ソースコードは GitHubリポジトリ で公開しています。記事中のコードは理解のために簡略化していますので、完全な実装はリポジトリをご覧ください。 (本稿は 英語版 からの翻訳記事です。) 概要 OAuth2とOpenID Connectとは OAuth2とOpenID Connect(OIDC)は、現代のWebアプリケーションの認証を支える重要な技術です。 OAuth2は認証の基盤となる技術で、ユーザーが自分の認証情報を直接渡すことなく、アプリケーションに特定の機能へのアクセス権を与えることができます。アプリケーションはアクセストークン(access token)を使ってこれらの機能を利用します。この実装では、広く使われている安全な方法である認可コードフロー(authorization code flow)を使って、ユーザー情報を取得しています。 OpenID Connect(OIDC)は、OAuth2を拡張して標準的な認証の仕組みを追加したものです。OAuth2が「アプリケーションに何を許可するか」を扱うのに対し、OIDCは「このユーザーは誰か」を確認することを主な目的としています。OIDCでは、ユーザー情報をJSON Web Token(JWT)形式のIDトークン(ID token)として提供します。これにより、ユーザーの認証とアクセス権限の管...

Axum Google OAuth2/OIDC implementation

Image
Introduction Overview What Are OAuth2 and OpenID Connect? How Authentication Works: Key Concepts Implementation Details Authentication Flow Route Structure Main Page Behavior Initiating the OAuth2 Flow Handling OAuth2 Callback Managing User Sessions Security Considerations Nonce Validation CSRF Protection PKCE Validation Cookie Security Response Mode Security Authentication with Authorization Code Flow ID Token Validation Conclusion Introduction Modern web applications often rely on OAuth2/OIDC for secure user authentication. As part of a recent exploration into Rust and Axum, I implemented a login system that integrates Google OAuth2. In this post, I’ll walk through the details of the implementation, covering both the theoretical aspects and practical steps involved in building a secure authentication system. To keep things concise, I’ve included simplified code snippets for key components. The full implementation is available in my GitHub repository . ...