Logto插件开发教程:扩展平台功能的完整指南
Logto作为一款开源的日志收集与分析平台,提供了强大的插件扩展机制,允许开发者通过连接器(Connector)扩展其功能。本教程将从环境搭建、核心概念到完整开发流程,带你构建一个自定义Logto插件。
连接器开发基础
Logto的插件系统基于连接器架构设计,所有连接器统一存放在packages/connectors/目录下。每个连接器都是一个独立模块,遵循标准化的开发规范和目录结构。
连接器目录结构
标准的Logto连接器目录结构如下:
connector-<name>/
├── src/
│ ├── index.ts # 连接器入口文件
│ ├── types.ts # 类型定义
│ └── constant.ts # 常量定义
├── package.json # 依赖配置
├── README.md # 使用文档
└── logo.svg # 连接器图标
核心开发规范
所有连接器共享统一的配置模板,通过项目根目录的模板同步机制自动维护一致性:
- templates/package.json定义了标准依赖和配置字段
- templates/sync-preset.js负责同步配置到所有连接器
注意:工作区依赖必须在连接器自身的package.json中显式声明,以确保PNPM正确解析依赖关系。
开发实战:构建自定义邮件连接器
以下将通过开发一个"企业邮件网关"连接器,演示完整的插件开发流程。
1. 创建项目结构
首先创建基础目录结构:
mkdir -p packages/connectors/connector-enterprise-email/src
touch packages/connectors/connector-enterprise-email/{package.json,README.md,logo.svg}
touch packages/connectors/connector-enterprise-email/src/{index.ts,types.ts,constant.ts}
2. 定义类型与常量
在src/types.ts中定义配置验证规则:
import { z } from 'zod';
export const enterpriseEmailConfigGuard = z.object({
apiKey: z.string().min(1),
endpoint: z.string().url(),
templates: z.array(
z.object({
usageType: z.enum(['signIn', 'register', 'forgotPassword']),
subject: z.string(),
content: z.string(),
})
),
});
export type EnterpriseEmailConfig = z.infer<typeof enterpriseEmailConfigGuard>;
在src/constant.ts中定义元数据:
import { ConnectorMetadata } from '@logto/connector-kit';
export const defaultMetadata: ConnectorMetadata = {
id: 'enterprise-email',
target: 'enterprise-email',
name: 'Enterprise Email',
description: 'Send emails via enterprise email gateway',
logo: './logo.svg',
readme: './README.md',
};
3. 实现核心逻辑
连接器入口文件src/index.ts是实现功能的核心,主要包含:
- 消息发送函数
- 连接器创建函数
以下是基础实现:
import { CreateConnector, EmailConnector } from '@logto/connector-kit';
import { validateConfig } from '@logto/connector-kit';
import { enterpriseEmailConfigGuard } from './types.js';
import { defaultMetadata } from './constant.js';
// 消息发送函数
const sendMessage = (getConfig) => async (data) => {
const { to, type, payload } = data;
const config = await getConfig(defaultMetadata.id);
// 验证配置
validateConfig(config, enterpriseEmailConfigGuard);
// 查找匹配的模板
const template = config.templates.find(t => t.usageType === type);
if (!template) {
throw new Error(`Template not found for type: ${type}`);
}
// 调用企业邮件API发送邮件
const response = await fetch(config.endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${config.apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to,
subject: template.subject,
content: template.content.replace('{{code}}', payload.code),
}),
});
if (!response.ok) {
throw new Error(`Failed to send email: ${await response.text()}`);
}
return { address: to, data: payload };
};
// 创建连接器
export const createEnterpriseEmailConnector: CreateConnector<EmailConnector> = async ({ getConfig }) => ({
metadata: defaultMetadata,
type: 'email',
configGuard: enterpriseEmailConfigGuard,
sendMessage: sendMessage(getConfig),
});
export default createEnterpriseEmailConnector;
4. 配置package.json
{
"name": "@logto/connector-enterprise-email",
"version": "1.0.0",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"dependencies": {
"@logto/connector-kit": "workspace:*",
"zod": "^3.22.4"
}
}
5. 注册连接器
将新连接器添加到packages/connectors/README.md的连接器列表中,以便控制台发现。
调试与测试
本地测试
使用Logto CLI进行本地测试:
pnpm build
logto connector test connector-enterprise-email
集成测试
编写集成测试文件src/index.test.ts:
import { describe, expect, it } from '@jest/globals';
import createEnterpriseEmailConnector from './index.js';
describe('enterprise email connector', () => {
it('should send email successfully', async () => {
const mockGetConfig = async () => ({
apiKey: 'test-key',
endpoint: 'https://mock-email-api.com/send',
templates: [{
usageType: 'signIn',
subject: 'Sign In Code',
content: 'Your code is {{code}}'
}]
});
const connector = await createEnterpriseEmailConnector({ getConfig: mockGetConfig });
const result = await connector.sendMessage({
to: 'user@example.com',
type: 'signIn',
payload: { code: '123456' }
});
expect(result.address).toBe('user@example.com');
});
});
部署与分发
构建发布包
pnpm build:connectors
cd packages/connectors/connector-enterprise-email
npm pack
安装与使用
在Logto实例中安装连接器:
logto connector install ./logto-connector-enterprise-email-1.0.0.tgz
然后在Logto控制台中启用并配置该连接器,即可开始使用企业邮件服务发送验证邮件。
高级开发指南
类型定义扩展
Logto提供了完整的类型定义,可在packages/toolkit/connector-kit/src/types中找到所有连接器相关的接口定义,包括:
- ConnectorMetadata - 连接器元数据
- EmailConnector - 邮件连接器接口
- SocialConnector - 社交登录连接器接口
错误处理最佳实践
使用ConnectorError类统一错误处理:
import { ConnectorError, ConnectorErrorCodes } from '@logto/connector-kit';
throw new ConnectorError(
ConnectorErrorCodes.InvalidConfig,
'API endpoint is required'
);
内置错误码可在packages/toolkit/connector-kit/src/errors中查看完整列表。
本地化支持
如需支持多语言模板,可实现GetI18nEmailTemplate接口:
const createConnector = async ({ getConfig, getI18nEmailTemplate }) => ({
// ...
sendMessage: async (data) => {
const customTemplate = await getI18nEmailTemplate?.(data.type, data.payload.locale);
// 使用自定义模板或默认模板
}
});
总结
通过本文介绍的步骤,你已掌握Logto插件开发的核心流程。Logto的连接器架构设计确保了插件开发的规范性和一致性,同时提供了灵活的扩展机制满足各种定制需求。
更多连接器示例可参考:
希望本教程能帮助你构建出强大的Logto插件,扩展平台的功能边界!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



