Composer REST Server自定义认证配置及数据库对接咨询
Composer REST Server 自定义认证策略实操指南
先给你吃颗定心丸:你的理解完全正确!采用自定义认证策略时,确实需要你自己处理用户凭证捕获→数据库校验→返回有效token这整套流程,REST Server会依赖你返回的结果来处理后续的请求授权。
核心流程拆解
自定义策略本质上是让你接管认证逻辑,具体步骤是:
- 捕获请求中的用户凭证:比如前端传来的用户名密码,或者放在
Authorization头里的凭证信息,这些都会被REST Server传递到你的自定义策略函数中 - 数据库校验合法性:你需要自己对接数据库,查询用户信息并验证凭证(比如密码哈希匹配、账号状态正常等)
- 返回标准格式的认证结果:校验通过后,返回包含token和用户身份信息的对象,REST Server会用这个token来识别后续请求的用户
数据库对接实操
因为Composer REST Server是基于Node.js开发的,所以你可以用任何Node.js支持的数据库驱动来对接,比如MySQL、PostgreSQL、MongoDB都可以。这里举个MySQL的简单示例:
- 先安装依赖:
npm install mysql2 bcryptjs jsonwebtoken
- 在自定义策略文件中编写校验逻辑:
const mysql = require('mysql2/promise'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); // 数据库配置 const dbConfig = { host: 'localhost', user: 'db_user', password: 'db_password', database: 'composer_auth' }; // 自定义认证函数,必须导出这个函数 module.exports = async function(request, callback) { try { // 从请求中获取凭证(这里假设前端用Basic Auth传用户名密码) const authHeader = request.headers.authorization; if (!authHeader || !authHeader.startsWith('Basic ')) { return callback(new Error('Invalid authorization header')); } // 解码用户名密码 const base64Credentials = authHeader.split(' ')[1]; const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii'); const [username, password] = credentials.split(':'); // 连接数据库查询用户 const connection = await mysql.createConnection(dbConfig); const [rows] = await connection.execute('SELECT id, username, password_hash FROM users WHERE username = ?', [username]); await connection.end(); if (rows.length === 0) { return callback(new Error('User not found')); } const user = rows[0]; // 校验密码哈希 const isPasswordValid = await bcrypt.compare(password, user.password_hash); if (!isPasswordValid) { return callback(new Error('Invalid password')); } // 生成JWT token,密钥要保密,最好用环境变量 const token = jwt.sign( { userId: user.id, username: user.username }, process.env.AUTH_SECRET_KEY, { expiresIn: '24h' } ); // 返回REST Server能识别的格式 callback(null, { token: token, user: { id: user.id, // 这个ID必须和Fabric网络中注册的用户ID一致! username: user.username // 可以添加自定义字段,比如roles: ['admin', 'member'] } }); } catch (error) { callback(error); } };
⚠️ 重要提醒:绝对不要在数据库中存储明文密码,一定要用bcrypt这类哈希算法加密后存储,校验时用bcrypt.compare匹配。
REST Server识别的返回格式要求
你的自定义策略函数必须返回一个包含以下两个字段的对象,否则REST Server会拒绝认证:
token:字符串类型,后续请求需要将这个token放在Authorization: Bearer <token>头中user:对象类型,必须包含id字段(这个ID要和Hyperledger Fabric网络中已经注册的用户身份ID对应,否则后续调用链码会失败),其他自定义字段(比如username、roles)可以按需添加
正确的返回示例:
{ token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyMTIzIiwidXNlcm5hbWUiOiJrYXJsLW5lbHNvbiIsImlhdCI6MTY5NjE1MzQwMCwiZXhwIjoxNjk2MjM5ODAwfQ.SW9kX2FzZHNhZGZhc2RmYXNkZmFzZA', user: { id: 'user123', username: 'karlnelson', roles: ['network_admin'] } }
启动REST Server时指定自定义策略
最后,启动REST Server时需要加上认证相关的参数,指定你的自定义策略文件:
composer-rest-server -c admin@your-business-network -a true -t custom -f ./path/to/your-custom-auth.js
参数说明:
-a true:启用认证-t custom:指定认证类型为自定义策略-f:指定自定义策略文件的路径
内容的提问来源于stack exchange,提问作者Karl Nelson
相关产品推荐
相关产品推荐

