【Auth0 活用】① フロントエンドとバックエンドの役割分担
1. はじめに
こんにちは、クラウドエース第三開発部の秋庭です。
今回は Auth0 でのバックエンド・フロントエンド、各 SDK の活用方法についてご紹介します。
前回までの記事で、Google Cloud の IDaaS サービスである Identity Platform の機能について紹介してきました。
今回から、同じ IDaaS サービスとして有名な Auth0 の機能についてこれまでの記事と同じようにご紹介し、比較できればと思います。
これまで作成した Identity Platform の記事の内容を交えて記述している箇所があります。その点ご了承ください。
本記事の対象読者
- Auth0 のフロントエンドとバックエンド SDK の役割を知りたい方
- すでに Identity Platform など他の IDaaS について知っており、比較するために Auth0 について知りたい方
本記事で取り扱わない内容
- Auth0 の基本的な紹介やセットアップ方法
- 各 SDK の詳細な API 仕様(公式ドキュメントを参照ください)
- Identity Platform の情報
- 過去の記事をご確認ください
参考
・Auth0 Docs
・Auth0 Libraries
2. 用語
本記事で扱う用語について記載します。
用語 | 説明 |
---|---|
SPA SDK | SPA のフロントエンドで使用される SDK です。 |
Management API SDK | バックエンドで使用される SDK です。認証系と管理系に分かれています。 |
Backend Service and API SDK | バックエンドで JWT を検証するためのライブラリです。 |
ユニバーサルログイン | Auth0 にホストされるログインページを経由してログインする方法です。 |
参考
・Auth0 Libraries
・Auth0 Universal Login
3. SPA SDK(フロントエンド)でできること
Auth0 の SPA SDK では、フロントエンドで以下の機能を提供します。
ユーザー認証・認証状態の管理
Auth0 は、様々な認証方法でのログインを提供しています。
以下が Auth0 が対応しているログイン方法です。
- パスワード認証
- Google / Facebook / Apple などのフェデレーション ID プロバイダと連携した認証
- メール・SMS でのパスワードレス認証
- SAML / OIDC 認証
- SMS / TOTP 多要素認証(MFA)
SPA SDK を使用することで、それらの認証方法を利用してログインすることができます。
デフォルトでは、Auth0 のホストするユニバーサルログイン画面にリダイレクトしてユーザー認証を行います。
React の SPA SDK では、以下のようにログインを実装することができます。
// src/App.js
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";
function App() {
const { isLoading, isAuthenticated, error, user, loginWithRedirect, logout } =
useAuth0();
if (isLoading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Oops... {error.message}</div>;
}
if (isAuthenticated) {
return (
<div>
Hello {user.name}{" "}
<button
onClick={() =>
logout({ logoutParams: { returnTo: window.location.origin } })
}
>
Log out
</button>
</div>
);
} else {
return <button onClick={() => loginWithRedirect()}>Log in</button>;
}
}
export default App;
ユニバーサルログイン画面
参考
・Authenticate
SPA SDK は React, Vue, Angular など、フレームワークごとに用意されており、構成に適した SDK を使用することができます。
React 向けの SPA SDK では、以下のように Auth0Provider
が提供されています。
Identity Platform ではこういった Provider などは自作する必要がありました。
import React from "react";
import { createRoot } from "react-dom/client";
import { Auth0Provider } from "@auth0/auth0-react";
import App from "./App";
const root = createRoot(document.getElementById("root"));
root.render(
<Auth0Provider
domain="{yourDomain}"
clientId="{yourClientId}"
authorizationParams={{
redirect_uri: window.location.origin,
}}
>
<App />
</Auth0Provider>
);
参考
・Auth0 React SDK
SPA SDK では、ユーザー認証後にアクセストークンを取得し、それをクライアント内で管理します。
保存先は、memory
か localStorage
を選択できます。
デフォルトは memory
となっており、インメモリに保存されています。
参考
・Token Storage
ユーザー情報の取得・管理
認証後、ユーザーのプロフィール情報を取得することができます。
import { useAuth0 } from "@auth0/auth0-react";
const UserProfile = () => {
const { user, isAuthenticated, isLoading } = useAuth0();
if (isLoading) return <div>Loading...</div>;
if (!isAuthenticated) return <div>未ログイン</div>;
return (
<div>
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
};
一部のユーザー情報はクライアントサイドからでも変更可能ですが、パスワードの設定はクライアントサイドからはできないようです。
ユニバーサルログイン画面から、パスワードの再設定を行うことは可能です。
![]() |
![]() |
参考
・Get Management API Access Tokens for Single-Page Applications
その他
Auth0 は、Identity Platform と同様にパスワードポリシーが設定できます。
Identity Platform では、クライアントサイドの SDK からパスワードがポリシーに適合しているか判断が可能でした。
Auth0 では、ユニバーサルログイン画面でのサインアップ時にパスワードポリシーに照合することが可能です。
![]() |
4. Management API SDK(バックエンド)でできること
Management API SDK は、Authentication API と Management API を実行するクライアントに分かれている構成になっています。
Go の Management API SDK では、それぞれサブパッケージとして提供されています。
ここでは Go での SDK を例に挙げますが、どの言語の SDK でも、2 つの API を扱う構成は同じです。
認証系サブパッケージで出来ること
Authentication サブパッケージは、Authentication API を実行するための SDK です。
主に以下の処理をバックエンドで行うことが出来ます。
- ログイン
- ログアウト
- サインアップ
- MFA OAuth の処理
- パスワードレスログインやパスワード変更のメール送信
デフォルトでのログインはクライアントサイドのユニバーサルログインで行われるため、Authentication API を使用してログインを実装する必要はありません。
カスタマイズされた認証操作が必要な場合に、バックエンドで SDK を使用して Authentication API を実行します。
参考
・authentication package - github.com/auth0/go-auth0/authentication - Go Packages
・Authentication API Explorer
・Auth0 Universal Login
管理系サブパッケージで出来ること
Management サブパッケージは、Management API を実行するための SDK となっています。
Management API では、Auth0 のダッシュボードから行えるような操作を API を通して行うことができます。
主に以下のような項目の操作が Management API SDK を使用して行えます。
- ブランディング
- ユニバーサルログイン画面のカスタマイズ
- メールや SMS テンプレートのカスタマイズ
- コネクション
- 連携する外部 ID プロバイダの設定等
- テナント
- テナント設定
- 組織(Organization)
- コネクションの設定
- ユーザーの追加や削除
- ユーザー
- ユーザー関連の CRUD 操作
- リフレッシュトークンの削除
- ログ
- ログの取得
- Stream でのログの取得
- ロール
- ロールの CRUD 操作
- ロールに紐づくユーザーの取得
参考
・Management API
・management package - github.com/auth0/go-auth0/management - Go Packages
・Introduction | Auth0 Management API v2
5. Backend Service and API SDK(バックエンド)でできること
Backend Service and API SDK は、バックエンドでアクセストークンを検証し、リクエストの認証を行う SDK です。
例として、Go では以下のように、go-jwt-middleware
を使用してアクセストークンを検証することができます。
package main
import (
"context"
"encoding/json"
"log"
"net/http"
"github.com/auth0/go-jwt-middleware/v2"
"github.com/auth0/go-jwt-middleware/v2/validator"
jwtmiddleware "github.com/auth0/go-jwt-middleware/v2"
)
var handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
claims, ok := r.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims)
if !ok {
http.Error(w, "failed to get validated claims", http.StatusInternalServerError)
return
}
payload, err := json.Marshal(claims)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(payload)
})
func main() {
keyFunc := func(ctx context.Context) (interface{}, error) {
// Our token must be signed using this data.
return []byte("secret"), nil
}
// Set up the validator.
jwtValidator, err := validator.New(
keyFunc,
validator.HS256,
"https://<issuer-url>/",
[]string{"<audience>"},
)
if err != nil {
log.Fatalf("failed to set up the validator: %v", err)
}
// Set up the middleware.
middleware := jwtmiddleware.New(jwtValidator.ValidateToken)
http.ListenAndServe("0.0.0.0:3000", middleware.CheckJWT(handler))
}
参考
6. SDK の比較
機能 | SPA SDK | Management API SDK | Auth0 Backend Service and API SDK |
---|---|---|---|
ユーザー認証 | ✅️ ※1 | ✅️ | - |
ユーザー管理(自分のアカウント) | ✅️ (作成 ※1・取得) ❌️ (更新・削除) |
✅️ | - |
ユーザー管理(全ユーザー) | ❌️ | ✅️ | - |
トークン検証 | - | - | ✅️ |
ロール・メタデータの付与 ※2 | ❌️ | ✅️ | - |
Private Key JWT でのログイン ※3 | ❌️ (JWT を利用してログイン) | ❌️ (JWT の作成) | - |
メールのカスタマイズ ※4 | ❌️ | ✅️ | - |
※1: ユニバーサルログイン画面から可能
※2: トークンに含むことの出来るデータを指します
※3: Identity Platform のカスタムトークンでのログインにあたる機能
React の Quickstart を行うとログイン -> アクセストークンを使用した API 呼び出しの動作を簡単に確認できます。
Auth0 にログインした状態で Quickstart にアクセスすると、設定値が書き込まれたサンプルがダウンロードできます。
参考
・Auth0 React SDK Quickstarts: Login
7. まとめ
Auth0 で利用できる、フロントエンド(SPA SDK)・バックエンド(ManagementSDK, Backend Service and API SDK)の役割を整理しました。
Auth0 の SPA SDK では、React や Vue など、フレームワークごとに SDK が用意されており、とても開発がしやすいと思いました。
Identity Platform はそういったフロントエンドフレームワークごとの SDK の提供はなく、また、mBaaS としてクライアントサイドに機能が集約されていたので、比較することで設計思想の違いも見えてきて興味深いです。
また、設定可能な項目が多くあり、ドキュメントも日本語のものが無いので調査に時間がかかることが多いです。
今回の記事を通して、Auth0 のバックエンドとフロントエンドの SDK の役割が整理され、IDaaS 導入の際の検討の一助になれば幸いです。
ここまで読んでいただき、ありがとうございました。
IDaaS 関連記事
Identity Platform 関連記事
Discussion