nuxt-oidc-auth
Nuxt OIDC Auth
Nuxt OIDC Authへようこそ。これは、Nuxt向けにネイティブOIDC(OpenID Connect)ベースの認証に焦点を当てたNuxtモジュールであり、SSRアプリケーションの高いカスタマイズ性とセキュリティを実現します。このモジュールは、トークン検証を除いて(広く知られ、テスト済みのJWT操作用jose
ライブラリ)、unjsエコシステム以外の外部依存関係を使用しません。このモジュールのセッション実装はnuxt-auth-utilsに基づいています。
機能
🔒 セキュアでシールドされたクッキーセッション
📝 完全な構成可能なOIDCフロー(状態、nonce、PKCE、トークンリクエストなど)を備えた、ジェネリックな仕様に準拠したOpenID Connectプロバイダー
⚙️ 一般的なOIDCプロバイダーのプリセット
🗂️ 自動登録されたルート(/auth/<provider>/login
、/auth/<provider>/logout
、/auth/<provider>/callback
)によるマルチプロバイダーサポート
👤 ユーザー情報の取得、ログインとログアウト、現在のセッションの再取得、トークンの更新トリガーを行うuseOidcAuth
コンポーザブル
💾 unstorageによって実現される暗号化されたサーバーサイド更新/アクセストークンストレージ
📤 デフォルトプロバイダーまたはカスタムログインページへの自動リダイレクトを備えたオプションのグローバルミドルウェア(プレイグラウンドを参照)
🔑 オプションのトークン検証
🕙 トークンの有効期限に基づくオプションのセッション有効期限チェック
↩️ トークンの有効期限切れ時のオプションの自動セッション更新
Nuxtサーバーによって提供されるローカル認証(およびその他)をサポートするモジュールをお探しの場合は、sidebaseのnuxt-authモジュール(authjsとNextAuthによって実現)をご覧ください➡️ nuxt-auth
最近の破壊的変更
⚠️ 0.16.0以降、プロバイダーのuserInfoエンドポイントからのデータは、providerInfo
ではなく、ユーザーオブジェクトのuserInfo
に書き込まれます。nuxt.config.ts
と.env/環境ファイル、および設定をそれに合わせて調整してください。useOidcAuth
コンポーザブルからユーザーオブジェクトを使用している場合は、providerInfo
へのアクセスをuserInfo
に変更してください。
セキュリティ情報
このモジュールは、OpenID Connect仕様で詳述されているように、機密クライアントシナリオでAuthorization Code Flow
とオプションでHybrid Flow
のみを実装しています。Implicit Flow
は今後サポートしません。これはもう使用すべきではなく、実際にはAuthorization Code Flow
に取って代わられています。Client Credential Flow
もサポートしません。これはOIDCの一部ではなく、OAuth2の一部であり、正しくはClient Credentials Grant
と呼ばれます。これは基本的に資格情報のトークンへの単純な交換であり、ユーザー認証を目的としたものではなく、単純なfetch
リクエストを使用して簡単に実装できます。
このモジュールは、サーバーAPIルートを使用するため、SSR(サーバーサイドレンダリング)が有効になっている場合のみ機能します。nuxt generate
ではこのモジュールを使用できません。
インストール
プロジェクトにnuxt-oidc-auth
依存関係を追加
nuxiを使用する場合
pnpm dlx nuxi@latest module add nuxt-oidc-auth
手動で行う場合
pnpm add -D nuxt-oidc-auth
nuxt.config.ts
のmodules
セクションにnuxt-oidc-auth
を追加
export default defineNuxtConfig({
modules: [
'nuxt-oidc-auth'
]
})
シークレットの設定
Nuxt OIDC Authは、ユーザーセッション、個々の認証セッション、永続的なサーバーサイドトークンストアを暗号化するために、3つの異なるシークレットを使用します。環境変数または.env
ファイルを使用して設定できます。すべてのシークレットは設定されていない場合に自動生成されますが、本番環境では手動で設定する必要があります。これは特にセッションストレージにとって重要です。たとえば、サーバーの再起動後にシークレットが変更されると、アクセスできなくなります。
ランダムなシークレットまたはキーの生成方法の参照が必要な場合は、出発点として例を作成しました。シークレット生成の例
- NUXT_OIDC_TOKEN_KEY(ランダムキー):これはbase64でエンコードされたランダムな暗号化AESキーである必要があります。サーバーサイドトークンストアの暗号化に使用されます。JSで
await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt']))
を使用してキーを生成できます。その後、base64にエンコードするだけです。 - NUXT_OIDC_SESSION_SECRET(ランダム文字列):これは少なくとも48文字のランダム文字列である必要があります。ユーザーセッションの暗号化に使用されます。
- NUXT_OIDC_AUTH_SESSION_SECRET(ランダム文字列):これは少なくとも48文字のランダム文字列である必要があります。OAuthフロー中の個々のセッションの暗号化に使用されます。
.envファイルに少なくとも48文字のNUXT_OIDC_SESSION_SECRET
環境変数を追加します。
# .env
NUXT_OIDC_TOKEN_KEY=base64_encoded_key
NUXT_OIDC_SESSION_SECRET=48_characters_random_string
NUXT_OIDC_AUTH_SESSION_SECRET=48_characters_random_string
✨ これだけです!これで、事前定義されたプロバイダーまたはカスタムOIDCプロバイダーを使用して、Nuxtアプリに認証を追加できます✨
認証プロバイダープリセット
Nuxt OIDC Authには、テスト済みのデフォルト値を持つ次のプロバイダーのプリセットが含まれています。
プロバイダー固有の設定
一部のプロバイダーには、承認、ログアウト、またはトークンリクエストを拡張するために使用できる特定の追加フィールドがあります。これらのフィールドは、プロバイダー設定のadditionalAuthParameters
、additionalLogoutParameters
、またはadditionalTokenParameters
を介して使用できます。
⚠️ トークンは、clientId
またはオプションのaudience
フィールドがアクセストークン(または存在する場合のid_token)のオーディエンスの一部である場合にのみ検証されます。validateAccessToken
またはvalidateIdToken
が設定されていても、オーディエンスが一致しない場合、トークンは検証されません。EntraやZitadelなどの一部のプロバイダーは、解析可能なJWTアクセストークンをまったく提供しないか、特定の場合にのみ提供します。これらのプロバイダーでは検証に失敗するため、オーディエンスが設定されている場合でも、検証を無効にする必要があります。
redirectUri
プロパティは常に必須であり、常に特定のプロバイダーのコールバックURIを指す必要があります。Auth0の場合、https://YOURDOMAIN/auth/auth0/callback
のようになります。プレイグラウンドのnuxt.config.tsには、複数のプロバイダーの例があります。
プロバイダーにプリセットがない場合は、設定でoidc
プロバイダーキーを使用して、ジェネリックOpenID Connectプロバイダーを追加できます。必要なフィールドを設定し、プロバイダーがOAuthおよびOIDC仕様で定義されているものとはわずかに異なる動作をすることを想定してください。セキュリティ上の理由から、nuxt.config.ts
ファイルにクライアントシークレットを直接記述することは避ける必要があります。環境変数を使用して、ランタイム設定に設定を挿入できます。参照としてプレイグラウンドフォルダの.env.example
ファイルを確認してください。
追加のプロバイダーの追加を要求する問題を作成することも検討してください。
# OIDC MODULE CONFIG
NUXT_OIDC_TOKEN_KEY=
NUXT_OIDC_SESSION_SECRET=
NUXT_OIDC_AUTH_SESSION_SECRET=
# AUTH0 PROVIDER CONFIG
NUXT_OIDC_PROVIDERS_AUTH0_CLIENT_SECRET=
NUXT_OIDC_PROVIDERS_AUTH0_CLIENT_ID=
NUXT_OIDC_PROVIDERS_AUTH0_BASE_URL=
# KEYCLOAK PROVIDER CONFIG
NUXT_OIDC_PROVIDERS_KEYCLOAK_CLIENT_SECRET=
NUXT_OIDC_PROVIDERS_KEYCLOAK_CLIENT_ID=
NUXT_OIDC_PROVIDERS_KEYCLOAK_BASE_URL=
...
Auth0
プロバイダーサポート
✅ PKCE
❌ Nonce
✅ State
✅ アクセストークン検証
❌ IDトークン検証
手順
additionalAuthParameters、additionalTokenParameters、またはadditionalLogoutParametersで使用される追加パラメーター
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
connection | 文字列 | - | オプション。ユーザーに特定の接続を使用してサインインすることを強制します。たとえば、githubの値を渡して、ユーザーをGitHubに直接送信し、GitHubアカウントでログインさせることができます。指定しない場合、ユーザーは構成されているすべての接続を含むAuth0 Lock画面が表示されます。構成済みの接続の一覧は、アプリケーションの「接続」タブで確認できます。 |
organization | 文字列 | - | オプション。ユーザーを認証するときに使用する組織のID。指定しない場合、アプリケーションが組織プロンプトの表示が構成されていると、ユーザーは認証時に組織名を入力できます。 |
invitation | 文字列 | - | オプション。組織招待のチケットID。組織メンバーを招待する場合、ユーザーが招待を受け入れると、招待と組織のキーバリューペアを転送することで、アプリケーションは招待の受諾を処理する必要があります。 |
loginHint | 文字列 | - | オプション。Auth0にリダイレクトするときに、ログインまたはサインアップページのユーザー名/メールフィールドに入力します。ユニバーサルログインエクスペリエンスでサポートされています。 |
audience | 文字列 | - | オプション。ウェブアプリがアクセスしようとするAPIの一意の識別子。 |
アプリのCredentials
タブの設定に応じて、authenticationScheme
を次のように設定します。'Client Secret (Post)'の場合はbody
、'Client Secret (Basic)'の場合はheader
、'None'の場合は''
。
AWS Cognito
プロバイダーサポート
✅ PKCE
✅ Nonce
✅ State
❌ アクセストークンの検証
❌ IDトークン検証
AWS CognitoはOAuth 2標準を正しく実装しておらず、対象者を示すaud
フィールドを提供しません。そのため、アクセストークンまたはIDトークンの検証はできません。
手順
AWS Cognitoを使用するには、少なくともbaseUrl
、clientId
、clientSecret
、logoutRedirectUri
のプロパティを指定する必要があります。baseUrl
は、authorizationUrl
、tokenUrl
、logoutUrl
、userInfoUrl
を動的に作成するために使用されます。サポートされているOAuthグラントタイプはAuthorization code grant
のみです。最終的なURLは、https://cognito-idp.eu-north-1.amazonaws.com/eu-north-1_SOMEID/.well-known/openid-configuration
のようになります。"許可されたコールバックURL"にredirectUri
、"許可されたサインアウトURL"にlogoutRedirectUri
を正しく登録していない場合もエラーが発生します。追加のスコープが必要な場合は、Nuxtの設定でscope
プロパティに指定します(例:scope: ['openid', 'email', 'profile'],
)。
Entra ID/Microsoft
プロバイダーサポート
✅ PKCE
✅ Nonce
✅ State
⚠️ アクセストークンの検証(サポートされていますが、カスタムオーディエンストークンでのみ可能なため無効になっています)
✅ IDトークンの検証
手順
additionalAuthParameters、additionalTokenParameters、またはadditionalLogoutParametersで使用される追加パラメーター
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
resource | 文字列 | - | オプション。要求されたリソースのリソース識別子。 |
audience | 文字列 | - | オプション。トークンの対象者。通常はクライアントID。 |
prompt | 文字列 | - | オプション。必要なユーザーインタラクションの種類を示します。有効な値はlogin、none、consent、select_accountです。 |
loginHint | 文字列 | - | オプション。このパラメータを使用して、ユーザーのサインインページのユーザー名とメールアドレスフィールドに事前に入力できます。アプリは、以前のサインインからlogin_hintオプションのクレームを既に抽出した後、再認証時にこのパラメータを使用できます。 |
logoutHint | 文字列 | - | オプション。ユーザーにアカウントの選択を促すことなく、サインアウトを実行できるようにします。logout_hintを使用するには、クライアントアプリケーションでlogin_hintオプションのクレームを有効にし、login_hintオプションのクレームの値をlogout_hintパラメータとして使用します。 |
domainHint | 文字列 | - | オプション。含まれている場合、アプリはユーザーがサインインページで実行するメールベースの検出プロセスをスキップし、ユーザーエクスペリエンスがわずかに合理化されます。 |
Microsoft Entra ID(旧Azure AD)からのアクセストークンを検証する場合は、スコープに独自のAPIが含まれていることを確認する必要があります。最初にAPIを登録し、要求するスコープをアプリ登録に公開する必要があります。openid
、mail
などのGraphAPI固有のエントリのみがスコープに含まれている場合、返されたアクセストークンは検証できませんし、検証すべきではありません。スコープが正しく設定されている場合は、validateAccessToken
オプションをtrue
に設定できます。
Entra External ID(旧Entra ID for Customers)でこのモジュールを使用する場合は、audience
設定フィールドをアプリケーションIDに設定してください。設定しないと、有効なOpenID Connect既知の設定を取得できず、JWTトークンを検証できなくなります。
GitHub
プロバイダーサポート
❌ PKCE
❌ Nonce
✅ State
❌ アクセストークンの検証
❌ IDトークン検証
手順
GitHubは厳密にはOIDCプロバイダーではありませんが、OIDCプロバイダーとして使用できます。検証が無効になっていること、およびskipAccessTokenParsing
オプションがtrue
のままになっていることを確認してください。
レガシーなOAuthアプリではなく、GitHub Appの使用を試してください。レガシーなOAuthアプリは同じレベルのセキュリティを提供せず、きめ細かい権限がなく、更新トークンを提供せず、テストもされていません。
OAuthアプリの設定でコールバックURLを<your-domain>/auth/github
として設定してください。
Keycloak
プロバイダーサポート
✅ PKCE
✅ Nonce
❌ State
✅ アクセストークン検証
❌ IDトークン検証
手順
additionalAuthParameters、additionalTokenParameters、またはadditionalLogoutParametersで使用される追加パラメーター
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
realm | 文字列 | - | オプション。このパラメータにより、Keycloakサーバー側でログインフローをわずかにカスタマイズできます。たとえば、値loginの場合にログイン画面の表示を強制します。 |
realm | 文字列 | - | オプション。ログインフォームのユーザー名/メールアドレスフィールドに事前に入力するために使用されます。 |
realm | 文字列 | - | オプション。Keycloakにログインページの表示をスキップし、代わりに指定されたIDプロバイダーに自動的にリダイレクトするように指示するために使用されます。 |
realm | 文字列 | - | オプション。'ui_locales'クエリパラメータを設定します。 |
これらのパラメータの詳細については、KeyCloakのドキュメントを参照してください。
Keycloakを使用するには、少なくともbaseUrl
、clientId
、clientSecret
のプロパティを指定する必要があります。baseUrl
は、authorizationUrl
、tokenUrl
、logoutUrl
、userInfoUrl
を動的に作成するために使用されます。baseUrl
には使用するrealmを含めてください(例:https://<keycloak-url>/realms/<realm>
)。Keycloakのポストログアウトリダイレクト機能を使用しない場合は、logoutUrl
をundefined
または''
に設定します。また、クライアントシークレットを取得できるようにClient authentication
を有効にすることも忘れないでください。
Zitadel
プロバイダーサポート
✅ PKCE
✅ Nonce
❌ State
✅ アクセストークン検証
❌ IDトークン検証
手順
Zitadelを使用するには、少なくともbaseUrl
、clientId
、clientSecret
のプロパティを指定する必要があります。baseUrl
は、authorizationUrl
、tokenUrl
、logoutUrl
、userInfoUrl
を動的に作成するために使用されます。このプロバイダーはPKCEとCode認証スキームをサポートしています。PKCEを使用する場合は、clientSecretを空文字列('')のままにします。
設定例
zitadel: {
clientId: '',
clientSecret: '', // Works with PKCE and Code flow, just leave empty for PKCE
redirectUri: 'https://127.0.0.1:3000/auth/zitadel/callback', // Replace with your domain
baseUrl: '', // For example https://PROJECT.REGION.zitadel.cloud
audience: '', // Specify for id token validation, normally same as clientId
logoutRedirectUri: 'https://google.com', // Needs to be registered in Zitadel portal
authenticationScheme: 'none', // Set this to 'header' if Code is used instead of PKCE
},
Vue Composable
Nuxt OIDC Authは、現在のユーザーセッションとやり取りするためのいくつかのAPIルートを自動的に追加し、useOidcAuth
コンポーザブルを追加します。これにより、Vueコンポーネントからセッションにアクセスするための次のrefとメソッドが提供されます。
loggedIn
user
currentProvider
fetch
refresh
login
logout
loggedIn
=> (boolean)
ユーザーが現在ログインしているかどうかを示します。
使用例
const { loggedIn } = useOidcAuth()
if (loggedIn.value) {
console.log('User is logged in')
}
else {
console.log('User is not logged in')
}
login(provider?: ProviderKeys | 'dev', params?: Record<string, string>)
=> (Promise)
ログインプロセスを開始します。
パラメータ
名前 | 説明 |
---|---|
provider | 使用する認証プロバイダー。指定しない場合は、デフォルトのプロバイダーを使用します。 |
params | ログインリクエストに含める追加のパラメータ。各パラメータは、プロバイダーの設定で'allowedClientAuthParameters'にリストされている必要があります。 |
使用例
<script setup>
const { loggedIn, user, login, logout } = useOidcAuth()
</script>
<template>
<div v-if="loggedIn">
<h1>Welcome {{ user.userName }}!</h1>
<p>Logged in since {{ user.loggedInAt }}</p>
<button @click="logout()">
Logout
</button>
</div>
<div v-else>
<h1>Not logged in</h1>
<a href="/auth/github/login">Login with GitHub</a>
<button @click="login()">
Login with default provider
</button>
</div>
</template>
user
=> (object)
現在のユーザーオブジェクト。
currentProvider
=> (string)
現在ログインしているプロバイダーの名前。
fetch()
=> (void)
現在のユーザーセッションを取得/更新します。
refresh()
=> (void)
新しいアクセストークンを取得するために、使用されているプロバイダーに対して現在のユーザーセッションを更新します。user
オブジェクトのcanRefresh
プロパティで示されているように、現在のプロバイダーが更新トークンを発行した場合にのみ使用できます。
logout(provider: string)
=> (Promise)
ログアウトプロセスを処理します。デフォルトのプロバイダーを設定していない場合は、常にオプションのprovider
パラメータを指定してください。currentProvider
プロパティから現在のプロバイダーを取得できます。
使用例
<script setup>
const { logout } = useOidcAuth()
</script>
<template>
<button @click="logout()">
Logout
</button>
</template>
デフォルトのプロバイダーが設定されていない場合、またはミドルウェアcustomLoginPage
がtrue
に設定されている場合の使用例
<script setup>
const { logout, currentProvider } = useOidcAuth()
</script>
<template>
<button @click="logout(currentProvider)">
Logout
</button>
</template>
ユーザーオブジェクト
useOidcAuth
によって提供されるuser
オブジェクトには、次のプロパティが含まれています。
名前 | 型 | 説明 |
---|---|---|
provider | 文字列 | 現在のセッションにログインするために使用されたプロバイダーの名前 |
canRefresh | boolean | 現在のセッションが更新トークンを公開したかどうか |
loggedInAt | number | 秒単位のログインタイムスタンプ |
updatedAt | number | 秒単位の更新タイムスタンプ |
expireAt | number | 秒単位のセッション有効期限タイムスタンプ。使用可能な場合はloggedInAt プラスセッションの最大有効期間、またはアクセストークンの有効期限のいずれか。 |
userInfo | Record<string, unknown> | プロバイダーのuserinfoエンドポイントから取得された追加情報 |
userName | 文字列 | プロバイダーまたは設定されたマッピングされたクレームのいずれかから取得されます。 |
claims | Record<string, unknown> | optionalClaims 設定が構成されている場合、IDトークンからの追加のオプションのクレーム。 |
accessToken | 文字列 | exposeAccessToken が構成されている場合にのみ存在する、公開されたアクセストークン。 |
idToken | 文字列 | exposeIdToken が構成されている場合にのみ存在する、公開されたアクセストークン。 |
プロジェクトに型宣言ファイル(例:auth.d.ts
)を作成することで、プロバイダー情報の型を拡張できます。
declare module '#oidc-auth' {
interface UserInfo {
// define the type here e.g.,
providerName: string
}
}
サーバーユーティリティ
次のヘルパーは、server/
ディレクトリに自動的にインポートされます。
ミドルウェア
このモジュールは、Nuxtサーバーにグローバルミドルウェアを自動的に追加できます。設定のmiddleware
セクションの下にあるglobalMiddlewareEnabled
を設定することで有効にできます。ミドルウェアは、ユーザーがログインしていない場合、すべてのリクエストを/auth/login
に自動的にリダイレクトします。middleware
設定でredirect
をfalse
に設定することで、この動作を無効にできます。/auth/login
ルートは、デフォルトのプロバイダーを定義した場合にのみ設定されます。カスタムログインページを使用し、デフォルトのプロバイダーを維持するか、デフォルトのプロバイダーをまったく設定しない場合は、middleware
設定でcustomLoginPage
をtrue
に設定できます。
customLoginPage
をtrue
に設定した場合、/auth/login
の下にNuxtアプリにログインページを手動で追加する必要があります。useOidcAuth
コンポーザブルのlogin
メソッドを使用して、ユーザーをそれぞれのプロバイダーのログインページにリダイレクトできます。customLoginPage
をtrue
に設定すると、/auth/logout
ルートも無効になります。/auth/logout
の下にNuxtアプリにログアウトページを手動で追加し、useOidcAuth
コンポーザブルのlogout
メソッドを使用してユーザーをログアウトするか、logout
メソッドに常にオプションのprovider
パラメータを指定してください。
<script setup>
const { logout, currentProvider } = useOidcAuth()
</script>
<template>
<button @click="logout(currentProvider)">
Logout
</button>
</template>
⚠️ /auth
パス以下のものは、グローバルミドルウェアによって保護されていません。認証以外の目的でこのパスを使用しないでください。
セッションの期限切れと更新
Nuxt OIDC Authは、セッションの有効期限切れをチェックし、必要に応じて自動的に更新します。 session
設定でexpirationCheck
とautomaticRefresh
をfalse
に設定することで、この動作を無効にできます。 session
オブジェクトにアクセスすると、セッションは自動的に更新されます。クライアント側ではuseOidcAuth
のrefresh
を使用して、サーバー側ではrefreshUserSession(event)
を呼び出すことで、セッションを手動で更新することもできます。
セッションの有効期限切れと更新は完全にサーバー側で処理され、ユーザーセッションの公開プロパティは自動的に更新されます。loggedInAt
などのセッションフィールドを上書きするフックを理論的には登録できますが、これは推奨されず、各更新で上書きされます。
OIDCイベントハンドラー
構成されたすべてのプロバイダーは、次のサーバールートを自動的に登録します。
/auth/<provider>/callback
/auth/<provider>/login
/auth/<provider>/logout
さらに、defaultProvider
が設定されている場合、次のルートルールはデフォルトのプロバイダーへの転送として登録されます。
/auth/login
/auth/logout
サーバーサイドコードでのセッションの使用
@nuxtjs/oidc-auth
モジュールのgetUserSession
関数を使用して、サーバー側のコードでユーザーセッションにアクセスできます。
import { getUserSession } from "nuxt-oidc-auth/runtime/server/utils/session.mjs"
export default eventHandler(async (event) => {
const session = await getUserSession(event)
return session.userName
})
ハンドラーコードから機密情報を公開しないように注意してください。
フック
OIDCモジュールのデフォルトの動作を拡張するために、次のフックを使用できます。
fetch
(ユーザーセッションがフェッチされたときに呼び出されます)clear
(ユーザーセッションがクリアされる前に呼び出されます)refresh
(ユーザーセッションが更新される前に呼び出されます)
⚠️ セッションを変更した場合は、refreshフックも更新してください。 そうしないと、クレームやその他のフィールドが消去されます。
例
export default defineNitroPlugin(() => {
sessionHooks.hook('fetch', async (session) => {
// Extend User Session
// Or throw createError({ ... }) if session is invalid
// session.extended = {
// fromHooks: true
// }
console.log('Injecting "status" claim as test')
if (!(Object.keys(session).length === 0)) {
const claimToAdd = { status: 'Fetch' }
session.claims = { ...session.claims, ...claimToAdd }
}
})
sessionHooks.hook('refresh', async (session) => {
console.log('Injecting "status" claim as test on refresh')
if (!(Object.keys(session).length === 0)) {
const claimToAdd = { status: 'Refresh' }
session.claims = { ...session.claims, ...claimToAdd }
}
})
sessionHooks.hook('clear', async (session) => {
// Log that user logged out
console.log('User logged out')
})
})
理論上は、loggedInAt
のような内部セッションフィールドを上書きするフックを登録できますが、これはセッションのloggedIn
状態に影響を与えるため、推奨されません。サーバー側の更新と期限切れロジックには影響しませんが、更新ごとに上書きされます。
設定リファレンス
このモジュールの設定は、nuxt.config.ts
ファイルで定義できます。
export default defineNuxtConfig({
oidc: {
defaultProvider: '<provider>',
providers: {
<provider>: {
clientId: '...',
clientSecret: '...'
}
},
middleware: {
globalMiddlewareEnabled: true,
customLoginPage: false
}
}
})
oidc
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
enabled | boolean | - | モジュールを有効/無効にします。 |
defaultProvider | 文字列 | - | デフォルトのプロバイダーを設定します。汎用的な/auth/login および/auth/logout ルートルールの自動登録を有効にします。 |
providers | <provider> | - | 設定された各プロバイダーの設定項目。「プロバイダー固有の設定」を参照してください。 |
session | AuthSessionConfig | - | オプションのセッション固有の設定 |
middleware | MiddlewareConfig | - | オプションのミドルウェア固有の設定 |
devMode | DevModeConfig | - | ローカル開発モードの設定 |
provideDefaultSecrets | boolean | true | Nitroプラグインを使用して、NUXT_OIDC_SESSION_SECRET、NUXT_OIDC_TOKEN_KEY、NUXT_OIDC_AUTH_SESSION_SECRETのデフォルト値を提供します。これをオフにすると、秘密鍵が提供されていない場合、アプリケーションが動作しなくなる可能性があります。 |
providers
<provider>
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
clientId | 文字列 | - | クライアントID |
clientSecret | 文字列 | - | クライアントシークレット |
responseType | 'code' | 'code token' | 'code id_token' | 'id_token token' | 'code id_token token' (オプション) | code | レスポンスタイプ |
authenticationScheme | 'header' | 'body' (オプション) | header | 認証スキーム |
responseMode | 'query' | 'fragment' | 'form_post' | 文字列 (オプション) | - | 認証リクエストのレスポンスモード |
authorizationUrl | 文字列 (オプション) | - | 承認エンドポイントURL |
tokenUrl | 文字列 (オプション) | - | トークンエンドポイントURL |
userInfoUrl | 文字列 (オプション) | '' | ユーザー情報エンドポイントURL |
redirectUri | 文字列 (オプション) | - | リダイレクトURI |
grantType | 'authorization_code' | 'refresh_token' (オプション) | authorization_code | グラントタイプ |
scope | string[] (オプション) | ['openid'] | スコープ |
pkce | boolean (オプション) | false | PKCE(Proof Key for Code Exchange)を使用します。 |
state | boolean (オプション) | true | ランダムな値を持つstateパラメータを使用します。stateを使用しない場合、nonceパラメータを使用してフローを識別します。 |
nonce | boolean (オプション) | false | ランダムな値を持つnonceパラメータを使用します。 |
userNameClaim | 文字列 (オプション) | '' | ユーザー情報エンドポイントが提供されていない場合、またはユーザー情報リクエストが失敗した場合のフォールバックとして、アクセストークンからユーザー名を取得するために使用されるユーザー名クレーム。 |
optionalClaims | string[] (オプション) | - | IDトークンから抽出するクレーム |
logoutUrl | 文字列 (オプション) | '' | ログアウトエンドポイントURL |
scopeInTokenRequest | boolean (オプション) | false | トークンリクエストにスコープを含めます。 |
tokenRequestType | 'form' | 'form-urlencoded' | 'json' (オプション) | 'form' | トークンリクエストタイプ |
audience | 文字列 (オプション) | - | トークン検証に使用されるAudience(デフォルトではリクエストに含まれません。追加するにはadditionalTokenParametersまたはadditionalAuthParametersを使用してください)。 |
requiredProperties | string[] | - | 実行時に検証される設定の必須プロパティ。 |
filterUserInfo | string[] (オプション) | - | これらのプロパティのみを含むようにユーザー情報レスポンスをフィルタリングします。 |
skipAccessTokenParsing | boolean (オプション) | - | アクセストークンのパースをスキップします(OIDC仕様に従わない/JWTアクセストークンを発行しないプロバイダー用)。 |
logoutRedirectParameterName | 文字列 (オプション) | - | ログアウトリダイレクトのクエリパラメータ名。クエリパラメータとしてlogoutUrlに追加されます。 |
additionalAuthParameters | Record<string, string> (オプション) | - | 承認リクエストに追加される追加パラメータ。可能なパラメータについては、「プロバイダー固有の設定」を参照してください。 |
additionalTokenParameters | Record<string, string> (オプション) | - | トークンリクエストに追加される追加パラメータ。可能なパラメータについては、「プロバイダー固有の設定」を参照してください。 |
baseUrl | 文字列 (オプション) | - | プロバイダーのベースURL。authorizationUrl、tokenUrl、userInfoUrl、logoutUrlを動的に作成する場合に使用します。 |
openIdConfiguration | 文字列 または Record<string, unknown> または function (config) => Record<string, unknown> (オプション) | - | OpenID構成URL、オブジェクト、またはOpenID構成オブジェクトに解決される関数プロミス。 |
validateAccessToken | boolean (オプション) | true | アクセストークンを検証します。 |
validateIdToken | boolean (オプション) | true | IDトークンを検証します。 |
encodeRedirectUri | boolean (オプション) | false | 承認リクエストでリダイレクトURIクエリパラメータをエンコードします。クエリパラメータの適切な解析を実装していないサービスとの互換性のためのみです。 |
exposeAccessToken | boolean (オプション) | false | セッションオブジェクト内のクライアントにアクセストークンを公開します。 |
exposeIdToken | boolean (オプション) | false | セッションオブジェクト内のクライアントに生のIDトークンを公開します。 |
callbackRedirectUrl | 文字列 (オプション) | / | 成功したコールバック後にリダイレクトするカスタムリダイレクトURLを設定します。 |
allowedClientAuthParameters | string[] (オプション) | [] | 認証リクエストに対してクライアント側でユーザーが追加したクエリパラメータの許可リスト。 |
sessionConfiguration | ProviderSessionConfig (オプション) | {} | セッション設定のオーバーライド。「セッション」を参照してください。 |
session
グローバルセッション設定には、次のオプションがあります。
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
automaticRefresh | boolean | true | リフレッシュトークンが利用可能な場合(ユーザーオブジェクトのcanRefresh プロパティで示される)、アクセストークンとセッションを自動的に更新します。 |
expirationCheck | boolean | true | アクセストークンの有効期限に基づいて、セッションの有効期限切れをチェックします。 |
expirationThreshold | number | 0 | アクセストークンの有効期限が切れる前に自動更新をトリガーする秒数。 |
maxAge | number | 60 * 60 * 24 (1日) | 秒単位での最大認証セッション時間。 |
cookie | `` | `` | sameSite とsecure の追加のクッキー設定オーバーライド。 |
グローバルセッション設定のオーバーライドとして、各プロバイダーで次のオプションを使用できます。
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
automaticRefresh | boolean | true | アクセストークンの有効期限に基づいて、セッションの有効期限切れをチェックします。 |
expirationCheck | boolean | true | リフレッシュトークンが利用可能な場合(ユーザーオブジェクトのcanRefresh プロパティで示される)、アクセストークンとセッションを自動的に更新します。 |
expirationThreshold | number | 0 | アクセストークンの有効期限が切れる前に自動更新をトリガーする秒数。 |
middleware
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
globalMiddlewareEnabled | boolean | - | グローバルミドルウェアを有効/無効にします。 |
customLoginPage | boolean | - | /auth/login と/auth/logout ルートルールの自動登録を有効/無効にします。 |
開発モード
0.10.0以降、ローカル開発モードが利用可能です。NODE_ENV
環境変数がprod/production
に設定されておらず、設定で開発モードが明示的に有効になっている場合にのみ有効にできます。開発モードは**ローカル**および**オフライン**開発用であり、設定または.env
の変数で設定できる静的なユーザーオブジェクトを返します。返されるユーザーオブジェクトの次のフィールドを設定できます。
claims
:devMode.claims
設定provider
:devMode.provider
設定userName
:devMode.userName
設定userInfo
:devMode.userInfo
設定idToken
:devMode.idToken
設定accessToken
:devMode.accessToken
設定
必要なタイプについては、ユーザーオブジェクトを参照してください。
有効化
開発モードを有効にするには、少なくとも次の設定が設定されていることを確認する必要があります。
session
->expirationCheck
をオフにする必要があります(false
)devMode
->enabled
をnuxt.config.ts
のoidc
部分でtrue
に設定します。
トークン生成
必要に応じて、開発モードはdevMode
-> generateAccessToken
設定がtrue
に設定されている場合、有効な署名付きアクセストークンを生成できます。このトークンはuser.accessToken
プロパティに公開されます。生成されたトークンのプロパティは次のとおりです。
iat
(発行日時):現在のDateTimeiss
(発行者):devMode.issuer
設定、デフォルトnuxt:oidc:auth:issuer
aud
:devMode.audience
設定、デフォルトnuxt:oidc:auth:audience
sub
:devMode.subject
設定、デフォルトnuxt:oidc:auth:subject
exp
:現在のDateTime + 24時間
⚠️ アクセストークンは固定されたローカルシークレットを使用して生成され、安全とは決して言えません。開発モードはローカル開発でのみ有効にでき、テスト目的でのみ使用してください。本番システムに開発モードにする可能性のある環境変数を設定しないでください。
コントリビュート
# Install dependencies
pnpm install
# Generate type stubs
pnpm run dev:prepare
# Develop with the playground
pnpm run dev
# Build the playground
pnpm run dev:build
# Run ESLint
pnpm run lint
⚠️ 免責事項
このモジュールはまだ開発中です。フィードバックと貢献は大歓迎です!自己責任でご使用ください。