Auth0 を使用した Ruby on Rails の認証の合理化:初心者ガイド
最近では、カスタムメイドからプラグアンドプレイ形式の認証まで、Ruby 開発者には選択肢がたくさんあります。ただし、ご存知のとおり、独自のソリューションを構築するにはコストがかかり、危険が伴う可能性があります。 Devise がほとんどのチームにとって事実上の標準である場合、代替案によってほとんどのチームの作業が簡素化される可能性があります。
この記事では、Ruby on Rails アプリケーションでの Auth0 のセットアップと使用方法について説明します。これには、ロールの処理からユーザー認証のための複数のプロバイダーへの依存まで、適切に動作させるために必要なすべてが含まれます。
はじめに
始めるために必要なものは次のとおりです。
- Auth0 アカウント
- Ruby on Rails アプリケーション (バージョン 7.x 以降)
Auth0 は、最大 7,000 ユーザーを処理できる無料枠のあるサードパーティ認証サービスです。始めるにはこれで十分です。さらに高度な機能が必要な場合でも、価格は手頃です。
Auth0 での Ruby アプリの構成
アプリケーションは Auth0 に依存してリダイレクトと呼び出しを通じてユーザーを認証するため、安全性を確保する必要があります。
Auth0 アカウントで、テナント内にアプリケーションを作成しましょう。アカウント内に複数のテナントを作成して、以下を分けることができます。
- ドメイン名。
- 異なる環境(開発、本番環境など)
- データが保存される国または地域
最初のテナントを作成したら、アプリケーションを構築できます。そこから始めましょう。
アプリケーションパネルの「設定」タブに進みます。以下をコピーして貼り付け、安全な場所に保存する必要があります:
- ドメイン名:
app-name.[eu,us,..].auth0.com - クライアントの ID
- クライアントの秘密
次のアプリケーション URI も入力する必要があります。これらの値をローカル開発セットアップに使用します。
- 許可されたコールバック URL:
http://localhost:3000/auth/auth0/callback(URL Auth0 は認証後にリダイレクトされます)。 - 許可されたログアウト URL:
http://localhost:3000(誰かがログアウトした後に Auth0 がリダイレクトする URL)。
アプリを設定してみましょう。
Ruby on Rails アプリケーションの準備
rails new を使用して、バニラの Ruby on Rails アプリケーションから始めることができます。 コマンド。
データベースとして SQLite3 に依存し、CSS ライブラリとして Tailwind に依存するものを生成してみましょう。ミニテストのインストールをスキップし、アプリケーションに「Auth0 記事」という名前を付けます。
いくつかの属性だけを含む User モデルを作成します。
これにより、アプリケーションのシンプルだが効率的なベースが構築されます。
Auth0 Gem をアプリに追加する
omniauth-auth0 が必要です および omniauth-rails_csrf_protection Ruby on Rails アプリケーションで Auth0 を使用するには。
Auth0 の構成
小さな構成ファイル (config/auth0.yml) を作成する必要があります。 ) 認証情報を開発環境に保存します。
ここでは、いくつかの erb を使用して環境変数に依存することもできます。
もちろん、Ruby on Rails の認証情報に依存することで、常に最新の状態を保つことができます。
このファイルは Auth0 イニシャライザ (config/initializers/auth0.rb) で使用されます。 )、これから作成します:
ここでわかるように、Rails.application.config_for を使用しています。 YAML ファイルのコンテンツを便利なハッシュとしてロードします。これを、Rails 暗号化認証情報ストレージなどの任意のシークレット処理ライブラリに置き換えることができます。
以下の点に注意してください:
- プロバイダ名 (
:auth0) ) - YAML ファイルの 3 つの項目。
AUTH0_CONFIGを通じて読み取られて使用されます。 ハッシュ。 callback_pathキーと値は、Auth0 インターフェースで設定したものと一致します。authorize_paramsとscopeその中にある鍵。これについては後で説明します。
認証を可能にするインターフェースとルーティング要素を作成する必要があります。
Tailwind を使用したルートと UI のセットアップ
この例では、TailwindCSS を備えたフレームワークのバージョン 7.1 を使用して、Ruby on Rails アプリケーションを操作します。
次のコマンドを使用します。
次に、インデックス アクションを使用して 2 つのコントローラを追加し、認証プロセスのテストの準備をします。
これら 2 つのコマンドを使用すると、以下が作成されます。
- 両方
public_controller.rbとprivate_controller.rbコントローラ、インデックス アクションを使用できるようになりました - 両方の関連ルート
- 関連するビュー
コールバックと失敗を処理するために Auth0 コントローラーを追加しましょう。コントローラー ファイル (bin/rails g controller auth0) を作成します。 ) に次の内容を追加します。
次に、これら 3 つのアクションを使用するようにルートを更新します。
次に、Login を追加します。 と Logout パブリック ビューとプライベート ビューのそれぞれのボタン:
これで「http://localhost:3000」にアクセスできるようになります。 Login を使用します。 ボタンをクリックすると、プライベートにリダイレクトされます。 ページ。そこに Logout があります。 ボタン。
ただし、いくつかの点が欠けています:
- ユーザーのプロフィールからのデータ
- ユーザーの識別と承認の処理
スコープとデータの操作
いくつかの手順を戻して、初期化子 (config/initializers/auth0.rb) を元に戻してみましょう。 ):
ここで重要なのはスコープです:openid profile 。これにより、Auth0 に対して、次のようないくつかの情報に関心があることがわかります。
- プロバイダー名 (Auth0)
- A
uid:ユーザーに一致する一意の識別子 infoハッシュ:名前、プロフィール写真の URL、空の「メール」キーが含まれますextra_infoハッシュ:もう一度、名前とプロフィール写真だけでなく、名と姓のペアも含めます
スコープのトピックの詳細については、Auth0 のドキュメントを参照してください。
上記の情報は貴重なので、少なくとも初回ログイン時には必ずそのデータをアプリケーション内のテーブルにコピーする必要があります。
そのためには、auth0_controller でリクエストとレスポンスのコンテンツを使用する必要があります。 特に、callback では アクション:
リダイレクトの前にブレークポイントを使用して、ハッシュを調べて実験します。
通常はメールアドレスも必要です。これを取得するには、スコープを更新します。
アプリケーション サーバーをリロードし、ログイン手順を実行した後、アプリケーションに追加情報へのアクセスを許可する必要があります。
callback で次のようなことができるようになりました。 アクション:
これにより、ユーザーのローカルの最新のプロファイルが確保されます。
セッションについての一言
セッションは、Ruby on Rails アプリケーションの特別なハッシュです。コントローラーやビューからアクセスでき、各訪問者に固有のストレージは限られています。
セッションを「開く」ことも「閉じる」こともできます。特定のデータセットが必要な場合は、セッションが開いていると判断できます。データがない場合は閉じられます。
Auth0 コントローラの次の行を覚えておいてください。
最初のコードは、raw_info に値を書き込みます。 ハッシュのキーをセッション ハッシュに変換し、2 番目のキーはセッション ハッシュをクリアするだけです。
次に、ApplicationHelper で次のヘルパー メソッドを定義できます。 :
セキュリティ上の懸念
次に、これをコントローラーの問題として使用してみましょう。アイデアは、private_controller など、ユーザーがアクセスするためにログインする必要があるコントローラーを定義することです。 .
次の懸念ファイルを作成できます:
これをコントローラで次のように使用できます。
訪問者がログインしていないにもかかわらず、/private/index を開こうとした場合 ページにアクセスすると、サイトのルートに自動的にリダイレクトされます。
他のプロバイダとの統合
Auth0 を通じて複数のプロバイダーに依存できます。ただし、Google がデフォルトとして定義されています。多くの企業にとって、それで十分です。
さらにプロバイダーが必要な場合は、認証に進んでください。 Auth0 の関連テナントのメニュー、ソーシャル サブメニューでは、追加のプロバイダを設定できます。
Auth0 を使用して多要素認証 (MFA) を構成できることにも注目してください。
これらの構成手順を除いて、プロセスは同じままです。私たちのアプリケーションは、訪問者が認証されたことを証明するために訪問者データのみを返します。
認可に向けて開放
これで、ユーザーを認証し、コールバックを通じてその情報をアプリケーションに送信できるようになりました。ハッシュからユーザーの電子メール アドレスを取得し、データベース内で関連するユーザーを見つける方法はすでに説明しました。
そこから、認可ポリシーを定義できます。
Pundit は認可ポリシーを定義して使用するのに最適な選択肢ですが、ユーザーのロールのチェックに依存しています。
role の使用 実際、attribute は最も簡単な方法です。これは、Rails コンソールまたはアプリケーションのバックエンド インターフェイスでユーザーを作成するときに、ユーザーの最初のログイン試行の前に入力できます。
または、管理者の電子メールのリストを取得し、ユーザーの作成時にユーザーの電子メールをリストと照合することもできます。
以上です!
これまでに取り上げた内容
この記事では、以下を設定しました。
- Auth0 のテナントとアプリケーション
- Ruby on Rails アプリケーションの Auth0 関連の gem
- アプリケーション内のルートとビュー
次に、
- セッションの概念を確認し、その使用方法を確認しました
- ユーザーがログインしているかどうかを確認するための基本ツールを作成しました
- ログイン要件の背後でコントローラを保護するためのコントローラに関する懸念を追加しました
- ユーザーをその役割に適合させる方法を確認しました
Auth0 およびその他の認証プロバイダーを使用すると、多くのコードを記述することなく、最先端の認証を Ruby on Rails アプリケーションに統合できます。多くの場合、これは、独自の認証レイヤーの実装に依存したり、Devise などの gem を使用したりするよりも、はるかに優れたオプションです。
コーディングを楽しんでください!
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
トーマス・リブーレ
ゲスト著者の Thomas は、フランスを拠点とするバックエンド コンサルタント兼クラウド インフラストラクチャ エンジニアです。 13 年以上にわたり、スタートアップや企業と協力してチーム、製品、インフラストラクチャを拡張してきました。彼は、フランスの GNU/Linux マガジンやブログにも何度か掲載されています。
Thomas Riboulet によるすべての記事
-
Pryでの例外の処理
あなたが私のようなら、あなたはRailsコンソールをよく使います。そして今では、PryがRailsコンソールに起こる最良のことであることに誰もが同意していると思います...まあ、これまで。 組み込みのこじ開けは、昔ながらのIRBに比べて、例外を除いて作業をはるかに簡単にするいくつかの非常に優れた機能です。 完全なバックトレースを表示 Pry(またはそのことについてはIRB)で例外が発生すると、バックトレースの短縮バージョンが表示されます。通常はこれで十分ですが、常にそうとは限りません。 pryでは、wtf -vコマンドを使用して、最新の例外の完全なバックトレースを確認できます。 -vフラ
-
`top`と`ps`で示されるようにRubyスクリプトのプロセス名を変更する方法
LinuxまたはOSXでプログラムを実行するときはいつでも、プロセス内で実行されます。そして、すべてのプロセスには名前があります。名前は、ps、top、htopなどのコマンドを実行したときに表示される名前です。 htopは、右端の列にプロセス名を表示します。 デフォルトのプロセス名はサックできます デフォルトでは、プロセスの名前は、実行しているプログラムを含む実行可能ファイル名から派生します。これは、ほとんどの実行可能ファイルでうまく機能します。結局のところ、「less」を実行するときは、そのプロセス名を「less」にする必要があることは理にかなっています。 ただし、コマンドラインから