Auth0とは
言語、フレームワークを問わずに数行のコードを追加するだけで、webサービスやネイティブアプリに認証・認可機能を実現できるサービス。
できること
- GoogleやFacebookなどのソーシャルアカウント認証
- メールやSMSを利用したワンタイムパスワード認証
- 多要素認証
- パスワードを忘れた場合等の再設定の一連のフロー
- ユーザー登録時に登録を促す情報の指定
- アクセスコントロール
- ログインに関するイベントからのweb hook
- 複数アプリケーションでのシングルサインオン
- 異常アクセスの検知やブロック
- etc.
利用例
- ログイン認証
- APIの認可サーバ
- APIサーバに認証組み込み
ログイン認証
種類
- ユニバーサルログイン: Auth0がホストするwebページでアプリケーションにログイン
- ログインと認証が同じドメインで行われ、認証情報がクロスドメインで移動しないため、セキュリティが向上し、フィッシング攻撃や中間者攻撃から保護される
- Auth0のダッシュボードからログインページの(少々の)UIと動作を変更できるため、アプリケーションコードの変更が不要
- Classic Universal LoginとNew Universal Loginがあり、カスタマイズ性と動作速度に差がある
New Universal Login(ほぼカスタマイズできない)でGoogle認証のみを指定した例
- 埋め込みログイン: アプリケーション上のwebページでアプリケーションにログイン
- 認証のみをAuth0に任せるので、アプリケーションと親和性のあるUXを考慮したログインページを作成できる
- 必然的にクロスオリジン認証になる
javascriptの場合の認証実行例
document
.getElementById('login')
.addEventListener('click', async () => {
await auth0.loginWithRedirect();
});
実装方法
- Auth0のダッシュボードにてApplication(と呼ばれるOauthクライアント)を作成する
- 上記のApplicationにログイン処理後に遷移するのコールバックURLを設定する
- ログイン認証を付与するwebアプリケーション側に、ログインページへの遷移処理とログイン処理後の処理を記述する
詳細は以下の通り
Quick Start (Railsの例だが、言語に応じた実装方法が表示される)
deviseからの移行
Railsの認証ライブラリのdeviseで利用していたcurrent_user
やauthenticate_user!
をそのまま利用するために以下のモジュールを作成し、application_controller.rb
にincludeする。
module Auth0Helper
private
def user_signed_in?
session[:userinfo].present?
end
def authenticate_user!
if user_signed_in?
@current_user = User.from_omniauth(session[:userinfo]) # from_omniauthはuserを特定するロジック
else
redirect_to login_path
end
end
def current_user
@current_user
end
end
Web APIの認可サーバ
クラウドサービスでAPIサービスを利用する時の認証認可の仕組みを提供する。
以下はAWSのAPI GatewayからLambda関数を呼び出す際のAPI Gatewayの認証認可のフロー
実装方法
- Auth0のダッシュボードにてAPI(と呼ばれるAuth0認証するためのエンドポイント)を作成する
- このAPIを利用することで、クライアントIDとクライアントシークレットを元にAuth0で認証できる
- Web APIを呼び出すクライアント側に、上記APIを呼び出す処理を記述する
詳細は以下の通り
Securing AWS HTTP APIs with JWT Authorizers
APIサーバ
実装方法
- Auth0のダッシュボードにてAPI(と呼ばれるAuth0認証するためのエンドポイント)を作成する
- このAPIを利用することで、クライアントIDとクライアントシークレットを元にAuth0で認証できる
- APIサーバ側に、Auth0からのレスポンスの検証処理を記述する