FeathersJS API密钥认证实现指南
什么是API密钥认证
API密钥认证是一种简单而有效的身份验证方式,特别适合机器对机器(M2M)的通信场景。在FeathersJS框架中,我们可以通过自定义认证策略来实现API密钥认证机制。
基础配置
首先需要在FeathersJS的配置文件中设置API密钥认证的相关参数:
{
"authentication": {
"secret": "your-secret-key", // 必须设置,即使不使用JWT
"service": "users", // 认证服务名称
"entity": null, // 可设置为null
"authStrategies": ["apiKey"], // 添加apiKey策略
"apiKey": {
"allowedKeys": ["YOUR_API_KEY_1", "YOUR_API_KEY_2"], // 允许的API密钥列表
"header": "x-api-key" // 自定义请求头字段
}
}
}
注意:即使只使用API密钥认证,也必须设置secret
、service
和entity
参数。entity
可以设置为null。
自定义API密钥策略
我们需要创建一个继承自AuthenticationBaseStrategy
的自定义策略类:
import { AuthenticationBaseStrategy, AuthenticationResult } from '@feathersjs/authentication';
import { NotAuthenticated } from '@feathersjs/errors';
class ApiKeyStrategy extends AuthenticationBaseStrategy {
async authenticate(authentication: AuthenticationResult) {
const { token } = authentication;
const config = this.authentication.configuration[this.name];
// 验证API密钥是否在允许列表中
if (!config.allowedKeys.includes(token)) {
throw new NotAuthenticated('无效的API密钥');
}
return {
apiKey: true,
authenticated: true
};
}
}
这个策略的核心是authenticate
方法,它接收认证请求,验证API密钥的有效性,并返回认证结果。
实现API密钥钩子
为了简化API密钥的使用,我们可以创建一个钩子来自动处理请求头中的API密钥:
import { HookContext, NextFunction } from '@feathersjs/feathers';
export default () => async (context: HookContext, next: NextFunction) => {
const { params, app } = context;
const headerField = app.get('authentication').apiKey.header;
const token = params.headers?.[headerField];
// 如果是外部请求且没有其他认证信息,使用API密钥认证
if (token && params.provider && !params.authentication) {
context.params = {
...params,
authentication: {
strategy: 'apiKey',
token
}
};
}
return next();
};
集成认证钩子
最后,我们需要将API密钥钩子与标准的认证钩子结合使用:
import { authenticate } from '@feathersjs/authentication/lib/hooks';
import allowApiKey from './hooks/allow-api-key';
// 在服务中使用
app.service('my-service').hooks({
before: {
all: [
allowApiKey(),
authenticate('jwt', 'apiKey') // 支持多种认证策略
]
}
});
最佳实践建议
-
密钥管理:不要将API密钥硬编码在配置文件中,应该使用环境变量或密钥管理服务
-
安全性:
- 使用HTTPS传输API密钥
- 定期轮换API密钥
- 为不同客户端分配不同密钥
-
性能考虑:API密钥认证通常比JWT等基于令牌的认证更轻量级,适合高并发场景
-
日志记录:记录API密钥的使用情况,便于审计和安全分析
通过以上步骤,我们就在FeathersJS中实现了一个完整且安全的API密钥认证系统。这种认证方式特别适合微服务间通信、自动化脚本调用API等场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考