跳到主要内容

Clerk

@mastra/auth-clerk 包使用 Clerk 为 Mastra 提供身份验证。它使用 Clerk 的身份验证系统验证传入请求,并通过 auth 选项与 Mastra 服务器集成。

前置条件
前置条件的直接链接

本示例使用 Clerk 身份验证。请务必将 Clerk 凭据添加到 .env 文件,并确保 Clerk 项目已正确配置。

.env
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 Dashboard 的 "API Keys" 下找到这些密钥。

安装
安装的直接链接

在使用 MastraAuthClerk 类之前,必须安装 @mastra/auth-clerk 包。

npm install @mastra/auth-clerk@latest

用法示例
用法示例的直接链接

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { MastraAuthClerk } from '@mastra/auth-clerk'

export const mastra = new Mastra({
server: {
auth: new MastraAuthClerk({
publishableKey: process.env.CLERK_PUBLISHABLE_KEY,
secretKey: process.env.CLERK_SECRET_KEY,
jwksUri: process.env.CLERK_JWKS_URI,
}),
},
})
信息

默认 authorizeUser 方法允许所有已通过身份验证的用户。要自定义用户授权,请在构造 Provider 时提供自定义 authorizeUser 函数。

有关所有可用的配置选项,请参阅 MastraAuthClerk

客户端设置
客户端设置的直接链接

使用 Clerk 身份验证时,需要在客户端从 Clerk 获取访问令牌,并将其传递给 Mastra 请求。

获取访问令牌
获取访问令牌的直接链接

使用 Clerk React hooks 对用户进行身份验证并获取其访问令牌:

lib/auth.ts
import { useAuth } from '@clerk/nextjs'

export const useClerkAuth = () => {
const { getToken } = useAuth()

const getAccessToken = async () => {
const token = await getToken()
return token
}

return { getAccessToken }
}

有关更多信息,请参阅 Clerk 文档

配置 MastraClient
configuring-mastraclient的直接链接

启用 auth 后,使用 MastraClient 发出的所有请求都必须在 Authorization 标头中包含有效的 Clerk 访问令牌:

lib/mastra/mastra-client.ts
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

发出经过身份验证的请求
发出经过身份验证的请求的直接链接

使用 Clerk 访问令牌配置 MastraClient 后,即可发送经过身份验证的请求:

src/components/test-agent.tsx
'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("What's the weather like in New York")

console.log({ response })
}

return <button onClick={handleClick}>Test Agent</button>
}