インストール
プロジェクトでAuth0 SPA SDKを使用するには、いくつかのオプションがあります。- CDNから:
<script src="https://cdn.auth0.com/js/auth0-spa-js/2.0/auth0-spa-js.production.js"></script>
。詳細については、「FAQ」をお読みください。 - npmを使用する場合:
npm install @auth0/auth0-spa-js
- yarnを使用する場合:
yarn add @auth0/auth0-spa-js
はじめに
クライアントを作成する
まず、Auth0Client
クライアントプロジェクトの新しいインスタンスを作成する必要があります。Auth0Client
インスタンスを作成してから、アプリケーションのレンダリングまたは初期化を行います。これを行うには、async/awaitメソッドまたはpromiseを使用します。クライアントには必ずインスタンスを1つだけ作成します。
createAuth0Client
を使用すると、いくつかの処理が自動的に行われます。
Auth0Client
のインスタンスを作成する。getTokenSilently
を呼び出し、ユーザーセッションを更新する。getTokenSilently
からのエラーをすべて抑止する(login_required
を除く)。
async/awaitを使用する
promiseを使用する
Auth0Client
コンストラクターを使って、クライアントを直接作成することもできます。これは、以下の場合に便利です。
- 初期化時に
getTokenSilently
への呼び出しをバイパスする - カスタムエラー処理を行う
- SDKを同期的に初期化する
ログインしてユーザー情報を取得する
次に、ユーザーがクリックしてログインを始めるボタンを作成します。<button id="login">クリックしてログイン</button>
作成したボタンのクリックイベントを待ち合わせます。イベントが発生した際には、適切なログインメソッドを実行してユーザーを認証します(この例ではloginWithRedirect()
)。ユーザーが認証されたら、getUser()
メソッドでユーザープロファイルを取得できます。
async/awaitを使用する
promiseを使用する
APIを呼び出す
APIを呼び出すには、ユーザーのアクセストークンを取得することから始めます。それから、要求にアクセストークンを使用します。この例では、getTokenSilently
メソッドを使ってアクセストークンを取得します。
<button id="callApi">APIを呼び出す</button>
async/awaitを使用する
promiseを使用する
ログアウト
ユーザーがログアウトするのにクリックするボタンを追加します。<button id="logout">ログアウト</button>
ストレージオプションを変更する
Auth0 SPA SDKはデフォルトでトークンをメモリーに保管します。ところが、ページの更新やブラウザーのタブでは永続性が途絶えてしまします。代わりに、SDKの初期化時にcacheLocation
プロパティをlocalstorage
に設定することで、トークンをローカルストレージに保存するよう選択できます。これは、Auth0のセッションCookieがアクセストークンを長期保管するのに対して、ブラウザーのプライバシー保護技術がそのアクセスを妨げる弊害を低減するのに役立ちます。
トークンをブラウザーのローカルストレージに保管すると、ページが更新されても、ブラウザータブが切り替わっても、持続性を確保できるというメリットがあります。しかし、攻撃者がクロスサイトスクリプティング(XSS)によってSPAでJavaScriptを実行できるようになると、ローカルストレージに保管されているトークンを取得されてしまいます。XSS攻撃の成功につながる脆弱性は、SPAソースコード、またはSPAに含まれるサードパーティのJavaScriptコード(ブートストラップ・jQuery・Google Analyticsなど)に存在する可能性があります。トークンストレージについての詳細をお読みください。
リフレッシュトークンのローテーションを使用する
リフレッシュトークンをローテーションさせて、サイレントモードで新しいアクセストークンを取得するように、Auth0 SPA SDKを構成できます。これによって、サイレント認証時にAuth0のセッションCookieへのアクセスを妨げるブラウザーのプライバシー保護技術を迂回するだけでなく、再利用の検出を組み込むこともできます。 このためには、初期化時にuseRefreshTokens
をtrue
に設定してSDKを構成します。
codeblockOld.header.login.logInButton codeblockOld.header.login.configureSnippet
offline_access
スコープを要求します。さらに、getTokenSilently
は/oauth/token
エンドポイントを呼び出し、フレッシュトークンをアクセストークンに直接交換します。SDKはリフレッシュトークンの保管について、ストレージ設定に従います。SDKがデフォルトのメモリー内ストレージに構成されている場合、リフレッシュトークンはページが更新されると失われます。
使用状況
以下は、SDKでさまざまなメソッドを使った例です。3つの例でjQueryが使用されていることに注意してください。リダイレクトでログインする
Auth0で/authorize
エンドポイントにリダイレクトし、ユニバーサルログインフローを開始します。
ポップアップでログインする
ユニバーサルログインのページでポップアップ画面を使用してログインします。error.popup.close
を使ってポップアップを手動で閉じることをユーザーに求めます。
options
オブジェクトでカスタムpopup
オプションを作成します。
リダイレクトのコールバックでログインする
ブラウザーがAuth0からSPAにリダイレクトされると、ログインフローを完了するためにhandleRedirectCallback
を呼び出す必要があります。
ユーザーの関与なくアクセストークンを取得する
非表示のiframe とprompt=none
を使用するか、またはリフレッシュトークンをローテーションさせることで、サイレントモードで新しいアクセストークンを取得します。リフレッシュトークンは、SDKの構成時にuseRefreshTokens
がtrue
に設定されている場合に使用されます。
SafariやBraveなど、サードパーティクッキーをブロックするブラウザーでは、リフレッシュトークンを使用せずにサイレントでアクセストークンを取得することはできません。カスタムドメインでの回避策については、「Safariを使ったトークン更新のトラブルシューティング」をお読みください。
getTokenSilently()
メソッドを使用する場合は、[Allow Skipping User Consent(ユーザー同意をスキップさせる)] がDashboardのAPI設定で有効になっている必要があります。さらに、ユーザー同意を’localhost’でスキップすることはできません。
ポップアップでアクセストークンを取得する
アクセストークンはポップアップでも取得することができます。getTokenSilently
とは違って、サードパーティのCookieがデフォルトで阻止されているブラウザーでも動作します。
異なるオーディエンスにアクセストークンを取得する
オプションは、ユーザー認証時に要求された、異なるオーディエンスとそのスコープを持つアクセストークンを取得するgetTokenSilently
に渡すこともできます。
これは、リフレッシュトークンを使わない場合(
useRefreshTokens: false
)にのみ有効です。リフレッシュトークンは、ユーザーの認証時に要求された特定のオーディエンスとスコープにバインドされているためです。ユーザーを取得する
認証されたユーザーのプロファイルデータを取得するには、getUser
メソッドを呼び出します。
IDトークンのクレームを取得する
認証されたユーザーのIDトークンにあるクレームを取得するには、getIdTokenClaims
メソッドを呼び出します。
ログアウト(デフォルト)
ログアウトのアクションを開始するには、logout
メソッドを呼び出します。
クライアントIDなしでログアウトする
クライアントIDが指定されていないログアウトのアクションを開始するには、logout
メソッドを呼び出し、clientId: null
を含めます。