MastraAuthClerk クラス
MastraAuthClerk
クラスは、Clerk を用いて Mastra の認証を提供します。Clerk の認証システムで受信リクエストを検証し、experimental_auth
オプションを通じて Mastra サーバーと統合します。
前提条件
この例では Clerk の認証を使用します。.env
ファイルに Clerk の認証情報を追加し、Clerk プロジェクトが正しく設定されていることを確認してください。
CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
CLERK_JWKS_URI=https://your-clerk-domain.clerk.accounts.dev/.well-known/jwks.json
注: これらのキーは Clerk ダッシュボードの「API Keys」で確認できます。
インストール
MastraAuthClerk
クラスを使用する前に、@mastra/clerk-auth
パッケージをインストールしてください。
npm install @mastra/clerk-auth@latest
使用例
import { Mastra } from "@mastra/core/mastra";
import { MastraAuthClerk } from '@mastra/clerk-auth';
export const mastra = new Mastra({
// ..
server: {
experimental_auth: new MastraAuthClerk({
publishableKey: process.env.CLERK_PUBLISHABLE_KEY,
secretKey: process.env.CLERK_SECRET_KEY,
jwksUri: process.env.CLERK_JWKS_URI
}),
},
});
注: デフォルトの
authorizeUser
メソッドは、認証済みユーザーをすべて許可します。ユーザーの認可をカスタマイズするには、プロバイダーを初期化する際にカスタムのauthorizeUser
関数を指定してください。
利用可能なすべての設定オプションについては、MastraAuthClerk の API リファレンスを参照してください。
クライアント側のセットアップ
Clerk 認証を使用する場合は、クライアント側で Clerk からアクセストークンを取得し、それを Mastra へのリクエストに渡す必要があります。
アクセストークンの取得
Clerk の React フックを使ってユーザーを認証し、アクセストークンを取得します:
import { useAuth } from "@clerk/nextjs";
export const useClerkAuth = () => {
const { getToken } = useAuth();
const getAccessToken = async () => {
const token = await getToken();
return token;
};
return { getAccessToken };
};
くわしくは Clerk ドキュメント をご覧ください。
MastraClient
の設定
experimental_auth
が有効な場合、MastraClient
を使ったすべてのリクエストには、Authorization
ヘッダーに有効な Clerk のアクセストークンを含める必要があります:
import { MastraClient } from "@mastra/client-js";
export const mastraClient = new MastraClient({
baseUrl: "https://<mastra-api-url>",
headers: {
Authorization: `Bearer ${accessToken}`
}
});
注: アクセストークンは
Authorization
ヘッダーでBearer
を前置する必要があります。 そのほかの設定オプションについては Mastra Client SDK を参照してください。
認証リクエストの送信
MastraClient
を Clerk のアクセストークンで設定したら、認証付きリクエストを送信できます:
"use client";
import { useAuth } from "@clerk/nextjs";
import { MastraClient } from "@mastra/client-js";
export const TestAgent = () => {
const { getToken } = useAuth();
async function handleClick() {
const token = await getToken();
const client = new MastraClient({
baseUrl: "http://localhost:4111",
headers: token ? { Authorization: `Bearer ${token}` } : undefined,
});
const weatherAgent = client.getAgent("weatherAgent");
const response = await weatherAgent.generate({
messages: "What's the weather like in New York",
});
console.log({ response });
}
return <button onClick={handleClick}>Test Agent</button>;
};