Auth0 Single-Page App SDK
Auth0 Single-Page App SDKは新しいJavaScriptライブラリーで、シングルページアプリ(SPA)でAuth0を使って認証と認可を実装します。高水準のAPIを提供して、大量の詳細情報を処理しているため、作成するコードの量を低減しながら、SPAにベストプラクティスを実装することができます。
Auth0 SPA SDKは、付与とプロトコルの詳細、トークンの失効と更新、そして、トークンの保管とキャッシュをも処理します。内部では、ユニバーサルログインとPKCEを用いた認可コード付与フローを実装しています。
ライブラリとAPIドキュメントはGitHubでホストされます。
新しいJavaScript SDKを使用中に問題やエラーが発生した場合は、FAQ(よくある質問)をお読みになられて、問題が提示されているか確認してください。
インストール
プロジェクトで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を使用する
import { createAuth0Client } from '@auth0/auth0-spa-js';
const auth0 = await createAuth0Client({
domain: '{yourDomain}',
clientId: '{yourClientId}'
});
Was this helpful?
promiseを使用する
createAuth0Client({
domain: '{yourDomain}',
clientId: '{yourClientId}'
}).then(auth0 => {
//...
});
Was this helpful?
Auth0Client
コンストラクターを使って、クライアントを直接作成することもできます。これは、以下の場合に便利です。
初期化時に
getTokenSilently
への呼び出しをバイパスするカスタムエラー処理を行う
SDKを同期的に初期化する
import { Auth0Client } from '@auth0/auth0-spa-js';
const auth0 = new Auth0Client({
domain: '{yourDomain}',
clientId: '{yourClientId}'
});
Was this helpful?
ログインしてユーザー情報を取得する
次に、ユーザーがクリックしてログインを始めるボタンを作成します。
<button id="login">クリックしてログイン</button>
作成したボタンのクリックイベントを待ち合わせます。イベントが発生した際には、適切なログインメソッドを実行してユーザーを認証します(この例ではloginWithRedirect()
)。ユーザーが認証されたら、getUser()
メソッドでユーザープロファイルを取得できます。
async/awaitを使用する
document.getElementById('login').addEventListener('click', async () => {
await auth0.loginWithRedirect({
authorizationParams: {
redirect_uri: 'http://localhost:3000/'
}
});
//logged in. you can get the user profile like this:
const user = await auth0.getUser();
console.log(user);
});
Was this helpful?
promiseを使用する
document.getElementById('login').addEventListener('click', () => {
auth0.loginWithRedirect({
authorizationParams: {
redirect_uri: 'http://localhost:3000/'
}
}).then(token => {
//logged in. you can get the user profile like this:
auth0.getUser().then(user => {
console.log(user);
});
});
});
Was this helpful?
APIを呼び出す
APIを呼び出すには、ユーザーのアクセストークンを取得することから始めます。それから、要求にアクセストークンを使用します。この例では、getTokenSilently
メソッドを使ってアクセストークンを取得します。
<button id="callApi">APIを呼び出す</button>
async/awaitを使用する
document.getElementById('callApi').addEventListener('click', async () => {
const accessToken = await auth0.getTokenSilently();
const result = await fetch('https://exampleco.com/api', {
method: 'GET',
headers: {
Authorization: 'Bearer ' + accessToken
}
});
const data = await result.json();
console.log(data);
});
Was this helpful?
promiseを使用する
document.getElementById('callApi').addEventListener('click', () => {
auth0
.getTokenSilently()
.then(accessToken =>
fetch('https://exampleco.com/api', {
method: 'GET',
headers: {
Authorization: 'Bearer ' + accessToken
}
})
)
.then(result => result.json())
.then(data => {
console.log(data);
});
});
Was this helpful?
ログアウト
ユーザーがログアウトするのにクリックするボタンを追加します。
<button id="logout">ログアウト</button>
$('#logout').click(async () => {
auth0.logout({
logoutParams: {
returnTo: 'http://localhost:3000/'
}
});
});
Was this helpful?
ストレージオプションを変更する
Auth0 SPA SDKはデフォルトでトークンをメモリーに保管します。ところが、ページの更新やブラウザーのタブでは永続性が途絶えてしまします。代わりに、SDKの初期化時にcacheLocation
プロパティをlocalstorage
に設定することで、トークンをローカルストレージに保存するよう選択できます。これは、Auth0のセッションCookieがアクセストークンを長期保管するのに対して、ブラウザーのプライバシー保護技術がそのアクセスを妨げる弊害を低減するのに役立ちます。
const auth0 = await createAuth0Client({
domain: '{yourDomain}',
clientId: '{yourClientId}',
cacheLocation: 'localstorage'
});
Was this helpful?
リフレッシュトークンのローテーションを使用する
リフレッシュトークンをローテーションさせて、サイレントモードで新しいアクセストークンを取得するように、Auth0 SPA SDKを構成できます。これによって、サイレント認証時にAuth0のセッションCookieへのアクセスを妨げるブラウザーのプライバシー保護技術を迂回するだけでなく、再利用の検出を組み込むこともできます。
このためには、初期化時にuseRefreshTokens
をtrue
に設定してSDKを構成します。
const auth0 = await createAuth0Client({
domain: '{yourDomain}',
clientId: '{yourClientId}',
useRefreshTokens: true
});
// Request a new access token using a refresh token
const token = await auth0.getTokenSilently();
Was this helpful?
リフレッシュトークンは、SPAで使用する前にテナント用に構成される必要もあります。
構成を終えると、SDKは認可ステップ中にoffline_access
スコープを要求します。さらに、getTokenSilently
は/oauth/token
エンドポイントを呼び出し、フレッシュトークンをアクセストークンに直接交換します。SDKはリフレッシュトークンの保管について、ストレージ設定に従います。SDKがデフォルトのメモリー内ストレージに構成されている場合、リフレッシュトークンはページが更新されると失われます。
使用状況
以下は、SDKでさまざまなメソッドを使った例です。3つの例でjQueryが使用されていることに注意してください。
リダイレクトでログインする
Auth0で/authorize
エンドポイントにリダイレクトし、ユニバーサルログインフローを開始します。
$('#loginRedirect').click(async () => {
await auth0.loginWithRedirect({
authorizationParams: {
redirect_uri: 'http://localhost:3000/'
}
});
});
Was this helpful?
ポップアップでログインする
ユニバーサルログインのページでポップアップ画面を使用してログインします。
$('#loginPopup').click(async () => {
await auth0.loginWithPopup();
});
Was this helpful?
ユーザーが認証フローを完了するのに、デフォルトの60秒のタイムアウトよりも長くかかった場合には、認証が中断されます。この際には、コードでエラーをキャッチして、以下のいずれかを行う必要があります。
再試行し、error.popup.close
を使ってポップアップを手動で閉じることをユーザーに求めます。
$('#loginPopup').click(async () => {
try {
await auth0.loginWithPopup();
} catch {error}
if (error instanceof auth0.PopupTimeoutError) {
// custom logic to inform user to retry
error.popup.close();
}
});
Was this helpful?
または、options
オブジェクトでカスタムpopup
オプションを作成します。
$('#loginPopup').click(async () => {
const popup = window.open(
'',
'auth0:authorize:popup',
'left=100,top=100,width=400,height=600,resizable'
);
try {
await auth0.loginWithPopup({ popup });
} catch {error}
if (error instanceof auth0.PopupTimeoutError) {
// custom logic to inform user to retry
error.popup.close();
}
});
Was this helpful?
リダイレクトのコールバックでログインする
ブラウザーがAuth0からSPAにリダイレクトされると、ログインフローを完了するためにhandleRedirectCallback
を呼び出す必要があります。
$('#loginRedirectCallback').click(async () => {
await auth0.handleRedirectCallback();
});
Was this helpful?
ユーザーの関与なくアクセストークンを取得する
非表示のiframe とprompt=none
を使用するか、またはリフレッシュトークンをローテーションさせることで、サイレントモードで新しいアクセストークンを取得します。リフレッシュトークンは、SDKの構成時にuseRefreshTokens
がtrue
に設定されている場合に使用されます。
メモリー内ストレージ(デフォルト)の設定でリフレッシュトークンが使用されると、新しいトークンは対応しているブラウザーのウェブワーカー(Web Worker)を使って取得されます。
$('#getToken').click(async () => {
const token = await auth0.getTokenSilently();
});
Was this helpful?
getTokenSilently()
メソッドを使用する場合は、[Allow Skipping User Consent(ユーザー同意をスキップさせる)]がDashboardのAPI設定で有効になっている必要があります。さらに、ユーザー同意を'localhost'でスキップすることはできません。
ポップアップでアクセストークンを取得する
アクセストークンはポップアップでも取得することができます。getTokenSilently
とは違って、サードパーティのCookieがデフォルトで阻止されているブラウザーでも動作します。
$('#getTokenPopup').click(async () => {
const token = await auth0.getTokenWithPopup({
authorizationParams: {
audience: 'https://mydomain/api/',
scope: 'read:rules'
}
});
});
Was this helpful?
異なるオーディエンスにアクセストークンを取得する
オプションは、ユーザー認証時に要求された、異なるオーディエンスとそのスコープを持つアクセストークンを取得するgetTokenSilently
に渡すこともできます。
$('#getToken_audience').click(async () => {
const differentAudienceOptions = {
authorizationParams: {
audience: 'https://mydomain/another-api/',
scope: 'read:rules',
redirect_uri: 'http://localhost:3000/callback.html'
}
};
const token = await auth0.getTokenSilently(differentAudienceOptions);
});
Was this helpful?
ユーザーを取得する
認証されたユーザーのプロファイルデータを取得するには、getUser
メソッドを呼び出します。
$('#getUser').click(async () => {
const user = await auth0.getUser();
});
Was this helpful?
IDトークンのクレームを取得する
認証されたユーザーのIDトークンにあるクレームを取得するには、getIdTokenClaims
メソッドを呼び出します。
$('#getIdTokenClaims').click(async () => {
const claims = await auth0.getIdTokenClaims();
// if you need the raw id_token, you can access it
// using the __raw property
const id_token = claims.__raw;
});
Was this helpful?
ログアウト(デフォルト)
ログアウトのアクションを開始するには、logout
メソッドを呼び出します。
$('#logout').click(async () => {
auth0.logout({
logoutParams: {
returnTo: 'http://localhost:3000/'
}
});
});
Was this helpful?
クライアントIDなしでログアウトする
クライアントIDが指定されていないログアウトのアクションを開始するには、logout
メソッドを呼び出し、clientId: null
を含めます。
$('#logoutNoClientId').click(async () => {
auth0.logout({
clientId: null,
logoutParams: {
returnTo: 'http://localhost:3000/'
}
});
});
Was this helpful?