跳至主要內容

MastraAuthGoogle 與 MastraRBACGoogle 類別

MastraAuthGoogle 類別
「MastraAuthGoogle 類別」的直接連結

MastraAuthGoogle 類別使用 Google Workspace 為 Mastra 提供身分驗證。它會實作採用加密 session cookie 的 OAuth 2.0 / OIDC 登入流程、驗證 Google ID token,並透過 auth 選項與 Mastra 伺服器整合。

使用範例
「使用範例」的直接連結

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

export const mastra = new Mastra({
server: {
auth: new MastraAuthGoogle({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
redirectUri: process.env.GOOGLE_REDIRECT_URI,
allowedDomains: ['example.com'],
}),
},
})
備註

若已設定必要的環境變數,可以省略建構函式參數。在這種情況下,請使用不帶任何引數的 new MastraAuthGoogle()

建構函式參數
「建構函式參數」的直接連結

clientId?:

string
= process.env.GOOGLE_CLIENT_ID
Google OAuth client ID。

clientSecret?:

string
= process.env.GOOGLE_CLIENT_SECRET
Google OAuth client secret。Studio SSO 必須提供此值。

redirectUri?:

string
= process.env.GOOGLE_REDIRECT_URI
SSO callback 的 OAuth redirect URI。必須與 Google Cloud OAuth client 中設定的 redirect URI 相符。

scopes?:

string[]
= ['openid', 'profile', 'email']
登入流程期間要求的 OAuth scope。

allowedDomains?:

string | string[]
= process.env.GOOGLE_ALLOWED_DOMAINS
允許的 Google Workspace 代管網域。Mastra 會將這些網域與已驗證的 hd claim 比對。

hostedDomain?:

string
= process.env.GOOGLE_HOSTED_DOMAIN or the single allowed domain
hd 傳遞給 Google 的代管網域登入提示。此值僅供提示,不會用於授權。

session?:

GoogleSessionOptions
Session cookie 設定。
GoogleSessionOptions

cookieName?:

string
Session cookie 的名稱。

cookieMaxAge?:

number
Cookie 的最長有效時間,以秒為單位。

cookiePassword?:

string
用於加密 session cookie 的密碼。長度必須至少為 32 個字元。若未設定,開發環境會使用自動產生的值,但此值不會在重新啟動後保留。

secureCookies?:

boolean
在 session cookie 上設定 Secure flag。

name?:

string
= 'google'
身分驗證 Provider 執行個體的自訂名稱。

環境變數
「環境變數」的直接連結

未提供建構函式選項時,會自動使用以下環境變數:

GOOGLE_CLIENT_ID:

string
來自 Google Cloud OAuth client 的 Google OAuth client ID。

GOOGLE_CLIENT_SECRET?:

string
Google OAuth client secret。SSO authorization code 流程必須提供此值。

GOOGLE_REDIRECT_URI?:

string
SSO callback 的 OAuth redirect URI。

GOOGLE_ALLOWED_DOMAINS?:

string
允許的 Google Workspace 代管網域,以逗號分隔。

GOOGLE_HOSTED_DOMAIN?:

string
SSO 登入期間傳遞給 Google 的代管網域登入提示。

身分驗證流程
「身分驗證流程」的直接連結

MastraAuthGoogle 會依下列順序驗證要求:

  1. Session cookie。 啟用 SSO 時,Provider 會讀取並解密已加密的 session cookie。有效且未過期的 session 可驗證使用者身分。
  2. Google ID token 備援方式:如果沒有有效的 session cookie,則會透過 Google 的 JWKS endpoint 驗證 Authorization header token。

身分驗證後,authorizeUser 會檢查使用者是否具有有效的 Google 使用者 ID、從 token 取得的到期時間是否尚未經過;如果已設定網域,還會檢查使用者已驗證的 hd claim 是否符合 allowedDomains

身分驗證 method
「身分驗證 method」的直接連結

authenticateToken(token, request?)
「authenticatetokentoken-request」的直接連結

驗證 Google ID token。啟用 SSO 時,此 method 會先檢查已加密的 session cookie,再驗證 Bearer token。

const user = await auth.authenticateToken(idToken, request)

傳回:Promise<GoogleUser | null>

getCurrentUser(request)
「getcurrentuserrequest」的直接連結

從 session cookie 或 Bearer Google ID token 傳回已通過身分驗證的使用者。

const user = await auth.getCurrentUser(request)

傳回:Promise<GoogleUser | null>

authorizeUser(user)
「authorizeuseruser」的直接連結

當使用者具有 ID、尚未過期,且在設定網域時符合 allowedDomains,傳回 true

const allowed = auth.authorizeUser(user)

傳回:boolean

getUser(userId)
「getuseruserid」的直接連結

傳回 null。Google ID token 會直接驗證,因此此 Provider 不會透過 ID 查詢使用者。

const user = await auth.getUser(userId)

傳回:Promise<GoogleUser | null>

GoogleUser 型別
「googleuser-type」的直接連結

GoogleUser 型別會以 Google 特定欄位擴充基礎 EEUser interface:

id:

string
Mastra 使用者 ID。使用 Google sub claim。

googleId:

string
Google Account subject 識別碼。

email?:

string
使用者電子郵件地址。

name?:

string
來自 Google 個人資料 claim 的使用者顯示名稱。

avatarUrl?:

string
使用者 Google 個人資料圖片的 URL。

hostedDomain?:

string
來自已驗證 hd claim 的 Google Workspace 代管網域。

expiresAt?:

Date
已驗證 ID token 的到期時間(若有)。

emailVerified?:

boolean
Google 是否回報該電子郵件地址已通過驗證。

groups?:

string[]
選填的預先解析 Google Workspace 群組角色 ID。

MastraRBACGoogle 類別
「MastraRBACGoogle 類別」的直接連結

MastraRBACGoogle 類別會將 Google Workspace 群組對應至 Mastra 權限。它會從 Google Admin SDK Directory API 擷取使用者群組,並依可設定的角色對應解析群組。請將其與 MastraAuthGoogle 或任何其他身分驗證 Provider 搭配使用。

備註

RBAC 需要有效的 Enterprise Edition 授權。開發環境中不需授權即可運作,因此你可以在本機試用;正式環境則需要授權。詳情請聯絡業務

使用範例
「使用範例」的直接連結

MastraRBACGoogle 傳遞給 rbac 選項,即可搭配身分驗證 Provider 使用:

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { MastraAuthGoogle, MastraRBACGoogle } from '@mastra/auth-google'

export const mastra = new Mastra({
server: {
auth: new MastraAuthGoogle(),
rbac: new MastraRBACGoogle({
serviceAccount: {
clientEmail: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL!,
privateKey: process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY!,
subject: process.env.GOOGLE_WORKSPACE_ADMIN_EMAIL!,
},
roleMapping: {
'admins@example.com': ['*'],
'engineering@example.com': ['agents:*', 'workflows:*', 'tools:*'],
'viewers@example.com': ['agents:read', 'workflows:read'],
_default: [],
},
}),
},
})

若要將 Google Workspace RBAC 與其他身分驗證 Provider 搭配使用,請傳入 getUserKey 函式,從其他 Provider 的使用者物件解析 Google Directory API 使用者 key:

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { MastraAuthAuth0 } from '@mastra/auth-auth0'
import { MastraRBACGoogle } from '@mastra/auth-google'

export const mastra = new Mastra({
server: {
auth: new MastraAuthAuth0(),
rbac: new MastraRBACGoogle({
getUserKey: user => user.email,
serviceAccount: {
clientEmail: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL!,
privateKey: process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY!,
subject: process.env.GOOGLE_WORKSPACE_ADMIN_EMAIL!,
},
roleMapping: {
'engineering@example.com': ['agents:*', 'workflows:*'],
'admins@example.com': ['*'],
_default: [],
},
}),
},
})

建構函式參數
「建構函式參數」的直接連結

roleMapping:

RoleMapping
將 Google Workspace 群組角色 ID 對應至 Mastra 權限字串的 array。使用 '_default' 為不符合任何群組的使用者指派權限。支援 '*'(完整存取權)和 'agents:*'(所有 Agent 操作)等萬用字元。

accessToken?:

string
預先取得的 Workspace Directory API access token。

getAccessToken?:

() => Promise<string> | string
傳回 Workspace Directory API access token 的 callback。

serviceAccount?:

GoogleWorkspaceServiceAccount
用於全網域委派 Directory API 存取的服務帳戶認證資訊。
GoogleWorkspaceServiceAccount

clientEmail:

string
Google 服務帳戶電子郵件地址。

privateKey:

string
以 PEM 編碼的 private key。支援來自 .env 檔案且經逸出的 \n 值。

privateKeyId?:

string
選填的 private key ID。

subject?:

string
使用全網域委派模擬的 Workspace 管理員使用者。

scopes?:

string[]
服務帳戶 token 的 OAuth scope。

getUserKey?:

(user: unknown) => string | undefined
從已通過身分驗證的使用者擷取 Directory API userKey。預設為 user.email

mapGroupToRoles?:

(group: GoogleWorkspaceGroup) => string[]
將 Google Workspace 群組對應至角色 ID。預設為 [group.email]

cache?:

PermissionCacheOptions
設定群組查詢的 LRU cache。
PermissionCacheOptions

maxSize?:

number
可快取的使用者數量上限。

ttlMs?:

number
存留時間,以毫秒為單位。

RBAC method
「RBAC method」的直接連結

getRoles(user)
「getrolesuser」的直接連結

傳回使用者的 Google Workspace 群組角色 ID。

const roles = await rbac.getRoles(user)

傳回:Promise<string[]>

getPermissions(user)
「getpermissionsuser」的直接連結

傳回從 Google Workspace 群組與 roleMapping 解析的 Mastra 權限。

const permissions = await rbac.getPermissions(user)

傳回:Promise<string[]>

hasPermission(user, permission)
「haspermissionuser-permission」的直接連結

檢查使用者是否具有某項權限。

const canReadAgents = await rbac.hasPermission(user, 'agents:read')

傳回:Promise<boolean>

hasRole(user, role)
「hasroleuser-role」的直接連結

檢查使用者是否解析為特定 Google Workspace 群組角色。

const isAdmin = await rbac.hasRole(user, 'admins@example.com')

傳回:Promise<boolean>

hasAllPermissions(user, permissions)
「hasallpermissionsuser-permissions」的直接連結

檢查使用者是否具有所有要求的權限。

const canManageAgents = await rbac.hasAllPermissions(user, ['agents:read', 'agents:update'])

傳回:Promise<boolean>

hasAnyPermission(user, permissions)
「hasanypermissionuser-permissions」的直接連結

檢查使用者是否至少具有一項要求的權限。

const canReadSomething = await rbac.hasAnyPermission(user, ['agents:read', 'workflows:read'])

傳回:Promise<boolean>

getAvailableRoles()
「getavailableroles」的直接連結

傳回 roleMapping 中設定的角色 ID,但不包含 _default

const roles = await rbac.getAvailableRoles()

傳回:Promise<{ id: string; name: string }[]>

getPermissionsForRole(roleId)
「getpermissionsforroleroleid」的直接連結

傳回為某個角色 ID 設定的權限。

const permissions = await rbac.getPermissionsForRole('engineering@example.com')

傳回:Promise<string[]>

clearCache()
「clearcache」的直接連結

清除所有已快取的 Google Workspace 群組查詢。

rbac.clearCache()

傳回:void

clearUserCache(userKey)
「clearusercacheuserkey」的直接連結

清除一個 Directory API 使用者 key(例如電子郵件地址)的群組查詢快取。

rbac.clearUserCache('user@example.com')

傳回:void

getCacheStats()
「getcachestats」的直接連結

傳回目前的群組查詢快取大小與大小上限。

const stats = rbac.getCacheStats()

傳回:{ size: number; maxSize: number }

其他設定
「其他設定」的直接連結

MastraRBACGoogle 會使用 GET https://admin.googleapis.com/admin/directory/v1/groups?userKey=... 並處理分頁。正式環境的 Google Workspace 部署應提供具有全網域委派的服務帳戶;若你的應用程式已管理 Google API token,則可傳入 accessToken / getAccessToken

如果 user.groups 已是 array,MastraRBACGoogle 會使用該值,且不會呼叫 Directory API。空的 groups array 表示使用者沒有 Google 群組角色;若已設定 _default,則會解析為 _default 權限。

MastraRBACGoogle 不會自動讀取服務帳戶環境變數。請透過 serviceAccount 選項傳入服務帳戶認證資訊,或傳入 accessToken / getAccessToken

Google 身分驗證文件