跳到主要内容

WorkOS

@mastra/auth-workos 包使用 WorkOS 为 Mastra 提供身份验证。它使用 WorkOS 访问令牌验证传入请求,并通过 auth 选项与 Mastra 服务器集成。

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

本示例使用 WorkOS 身份验证。请确保:

  1. workos.com 创建 WorkOS 账户
  2. 在 WorkOS Dashboard 中设置 Application
  3. 配置重定向 URI 和允许的来源
  4. 设置 Organization,并根据需要配置用户角色
.env
WORKOS_API_KEY=sk_live_...
WORKOS_CLIENT_ID=client_...
备注

可以分别在 WorkOS Dashboard 的 API Keys 和 Applications 下找到 API 密钥和 Client ID。

有关详细设置说明,请参阅适用于相应平台的 WorkOS 文档

安装
安装的直接链接

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

npm install @mastra/auth-workos@latest

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

使用环境变量的基本用法
使用环境变量的基本用法的直接链接

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

export const mastra = new Mastra({
server: {
auth: new MastraAuthWorkos(),
},
})

自定义配置
自定义配置的直接链接

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

export const mastra = new Mastra({
server: {
auth: new MastraAuthWorkos({
apiKey: process.env.WORKOS_API_KEY,
clientId: process.env.WORKOS_CLIENT_ID,
}),
},
})

配置
配置的直接链接

默认授权
默认授权的直接链接

默认情况下,MastraAuthWorkos 允许任何已通过身份验证的 WorkOS 用户访问。当解析出的用户对象同时包含 Mastra 用户 ID 和 WorkOS 用户 ID 时,授权检查成功。

加载 FGA 成员资格
加载 FGA 成员资格的直接链接

使用 MastraFGAWorkos 时,请设置 fetchMemberships: true。这会让身份验证 Provider 在身份验证期间加载用户的 WorkOS Organization 成员资格,使 FGA 检查能够解析正确的 Organization 成员资格 ID。

src/mastra/auth.ts
import { MastraAuthWorkos, MastraFGAWorkos } from '@mastra/auth-workos'

const workosAuth = new MastraAuthWorkos({
apiKey: process.env.WORKOS_API_KEY,
clientId: process.env.WORKOS_CLIENT_ID,
fetchMemberships: true,
})

const workosFga = new MastraFGAWorkos({
apiKey: process.env.WORKOS_API_KEY,
clientId: process.env.WORKOS_CLIENT_ID,
})

fetchMembershipsfalse 时,Mastra 会跳过每个已认证请求中的额外 WorkOS listOrganizationMemberships() 调用。

服务令牌和自定义 JWT 模板
服务令牌和自定义 JWT 模板的直接链接

对于机器到机器或服务账户访问,可以配置 MastraAuthWorkos,使其信任来自 WorkOS 自定义 JWT 模板的已验证 bearer-token claim。

src/mastra/auth.ts
import { MastraAuthWorkos } from '@mastra/auth-workos'

const workosAuth = new MastraAuthWorkos({
apiKey: process.env.WORKOS_API_KEY,
clientId: process.env.WORKOS_CLIENT_ID,
redirectUri: process.env.WORKOS_REDIRECT_URI,
trustJwtClaims: true,
jwtClaims: {
organizationId: 'org_id',
organizationMembershipId: 'urn:mastra:organization_membership_id',
},
})

当 JWT 模板已包含 Mastra 所需的准确 FGA 上下文(例如 organizationMembershipId、租户 ID 或服务主体标识符)时,此功能很有用。启用 trustJwtClaims 后,如果 bearer 令牌不应通过 workos.userManagement.getUser() 往返处理,Mastra 可以回退到这些已验证 claim。

自定义授权
自定义授权的直接链接

如果需要更严格的授权,请继承 MastraAuthWorkos 并覆盖 authorizeUser()

src/mastra/auth.ts
import { MastraAuthWorkos } from '@mastra/auth-workos'
import type { HonoRequest } from 'hono'

class AdminOnlyWorkosAuth extends MastraAuthWorkos {
async authorizeUser(user: any, _request: HonoRequest): Promise<boolean> {
return user?.metadata?.role === 'admin'
}
}

const workosAuth = new AdminOnlyWorkosAuth({
apiKey: process.env.WORKOS_API_KEY,
clientId: process.env.WORKOS_CLIENT_ID,
})

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

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

使用 WorkOS 身份验证时,需要实现 WorkOS 身份验证流程,将授权码交换为访问令牌,然后在 Mastra 请求中使用该令牌。

安装 WorkOS SDK
安装 WorkOS SDK的直接链接

首先,在应用中安装 WorkOS SDK:

npm install @workos-inc/node

将代码交换为访问令牌
将代码交换为访问令牌的直接链接

用户完成 WorkOS 身份验证流程并携带授权码返回后,请将授权码交换为访问令牌:

lib/auth.ts
import { WorkOS } from '@workos-inc/node'

const workos = new WorkOS(process.env.WORKOS_API_KEY)

export const authenticateWithWorkos = async (code: string, clientId: string) => {
const authenticationResponse = await workos.userManagement.authenticateWithCode({
code,
clientId,
})

return authenticationResponse.accessToken
}
备注

有关更多身份验证方法和配置选项,请参阅 WorkOS User Management 文档

配置 MastraClient
configuring-mastraclient的直接链接

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

lib/mastra/mastra-client.ts
import { MastraClient } from '@mastra/client-js'

export const createMastraClient = (accessToken: string) => {
return new MastraClient({
baseUrl: 'https://<mastra-api-url>',
headers: {
Authorization: `Bearer ${accessToken}`,
},
})
}
信息

访问令牌在 Authorization 标头中必须带有 Bearer 前缀。

有关更多配置选项,请参阅 Mastra Client SDK

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

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

src/api/agents.ts
import { WorkOS } from '@workos-inc/node'
import { MastraClient } from '@mastra/client-js'

const workos = new WorkOS(process.env.WORKOS_API_KEY)

export const callMastraWithWorkos = async (code: string, clientId: string) => {
const authenticationResponse = await workos.userManagement.authenticateWithCode({
code,
clientId,
})

const token = authenticationResponse.accessToken

const mastra = new MastraClient({
baseUrl: 'http://localhost:4111',
headers: {
Authorization: `Bearer ${token}`,
},
})

const weatherAgent = mastra.getAgent('weatherAgent')
const response = await weatherAgent.generate("What's the weather like in Nairobi")

return response.text
}