はじめに#
研究データ管理基盤「GakuNin RDM」と Next.js アプリケーションを OAuth2 で連携する方法を解説します。GakuNin RDM は OSF(Open Science Framework)互換の API を提供しているため、OSF の OAuth2 フローを参考に実装できます。
本記事では、next-auth を使用した実装方法と、アクセストークンの自動リフレッシュ というハマりポイントについて詳しく説明します。
GakuNin RDM とは#
GakuNin RDM(Research Data Management)は、国立情報学研究所(NII)が提供する研究データ管理サービスです。
研究者が研究データを安全に保存・共有・公開できるプラットフォームで、学認(GakuNin)認証との連携により、日本の大学・研究機関のユーザーが利用できます。
事前準備#
1. OAuth アプリケーションの登録#
GakuNin RDM の設定画面から OAuth アプリケーションを登録します。
- https://rdm.nii.ac.jp/settings/applications/ にアクセス
- 「Developer application を登録する」をクリック
- 以下を設定:
- Application name : アプリ名
- Application homepage URL :
http://localhost:3000(開発時) - Application description : 説明
- Authorization callback URL :
http://localhost:3000/api/auth/callback/gakunin
登録後、Client ID と Client Secret が発行されます。
2. 環境変数の設定#
next-auth でのカスタムプロバイダー設定#
GakuNin RDM は next-auth のビルトインプロバイダーには含まれていないため、カスタムプロバイダーとして設定します。
基本設定#
ポイント#
- token.request のカスタマイズ : GakuNin RDM は
application/x-www-form-urlencoded 形式でのトークンリクエストを期待するため、カスタムリクエスト関数を実装 - userinfo のパース : OSF API は
{ data: { id, attributes: { ... } } } という構造でレスポンスを返すため、profile 関数でマッピング
ハマりポイント:トークンの自動リフレッシュ#
OAuth2 のアクセストークンには有効期限があります(GakuNin RDM では約1時間)。
next-auth のデフォルト実装では、トークンのリフレッシュは行われません 。そのため、ログイン後しばらくすると、以下のようなエラーが発生します:
ユーザーはログイン済みなのに、API が 401 エラーを返す、という混乱を招く状況になります。
解決策#
JWT コールバックでトークンの有効期限を管理し、期限切れ前に自動リフレッシュを行います。
フロー図#
クライアント側でのエラーハンドリング#
リフレッシュトークンも期限切れの場合、session.error に "RefreshAccessTokenError" がセットされます。これを検知して再サインインを促すことができます。
API での使用例#
まとめ#
GakuNin RDM と next-auth を連携する際のポイント:
- カスタムプロバイダー として設定が必要
- トークンリクエスト は
application/x-www-form-urlencoded 形式 - アクセストークンの自動リフレッシュ を実装しないと、ログイン済みでも 401 エラーが発生する
- リフレッシュトークンも期限切れ の場合に備えて、クライアント側でエラーハンドリングを実装
特に3番目のトークンリフレッシュは見落としがちなので、OAuth2 連携を実装する際は必ず考慮しましょう。