Hyperledger Composer多客户端下Passport-Github的successRedirect配置问题
实现动态重定向到对应Angular应用端口的方案
我之前也遇到过类似的场景,固定的successRedirect确实没法满足多客户端的需求。核心思路是放弃硬编码重定向地址,改用动态逻辑根据请求来源判断目标地址,下面是具体的实现步骤:
1. 切换到自定义配置文件(而非环境变量)
Composer Rest Server的环境变量COMPOSER_PROVIDERS没法直接配置回调函数,所以我们需要创建一个JavaScript配置文件来灵活控制Passport策略。
首先创建composer-rest-config.js文件:
const passport = require('passport'); const GitHubStrategy = require('passport-github').Strategy; // 维护允许的重定向地址列表,防止恶意跳转攻击 const ALLOWED_REDIRECTS = [ 'http://localhost:4200', 'http://localhost:4300' ]; module.exports = { // 启用session(必须,用来临时存储重定向信息) authentication: { session: true }, // 自定义Passport策略配置 passport: { strategies: { github: { provider: 'github', strategy: GitHubStrategy, options: { clientID: process.env.GITHUB_CLIENT_ID, clientSecret: process.env.GITHUB_CLIENT_SECRET, callbackURL: '/auth/github/callback' // 保持和GitHub开发者后台一致 }, // 你的用户验证逻辑(和之前保持一致即可) verify: async (accessToken, refreshToken, profile, done) => { // 示例:根据GitHub profile查找/创建系统内用户 try { // 这里替换成你的业务逻辑 const user = await findOrCreateUser(profile); done(null, user); } catch (err) { done(err); } }, // 自定义回调处理重定向 callback: (req, res) => { // 从请求参数中获取预先传入的重定向地址 const targetRedirect = req.query.redirect_uri; // 验证地址是否在允许列表内 const finalRedirect = ALLOWED_REDIRECTS.includes(targetRedirect) ? targetRedirect : ALLOWED_REDIRECTS[0]; // 默认 fallback 到第一个应用 res.redirect(finalRedirect); } } } }, // 配置CORS允许两个Angular应用的域名 cors: { origin: ALLOWED_REDIRECTS, credentials: true } };
2. 修改Angular应用的认证跳转链接
让两个Angular应用在发起GitHub认证请求时,主动带上自己的重定向地址参数:
- 端口4200的应用跳转链接:
http://[你的Composer Rest Server地址]/auth/github?redirect_uri=http://localhost:4200 - 端口4300的应用跳转链接:
http://[你的Composer Rest Server地址]/auth/github?redirect_uri=http://localhost:4300
3. 启动Composer Rest Server时指定配置文件
用以下命令启动,替换成你的网络名称和认证信息:
composer-rest-server \ -c composer-rest-config.js \ -n your-business-network \ -p hlfv1 \ -i admin \ -s adminpw \ -m true \ -t true
可选优化:用Session存储重定向地址
如果不想在URL里暴露重定向参数,可以改用Session临时存储:
- 在配置文件的
middleware.before里添加一个前置中间件:
module.exports = { middleware: { before: [ (req, res, next) => { // 当用户访问认证接口时,把来源地址存入session if (req.path === '/auth/github' && req.headers.referer) { const referer = new URL(req.headers.referer); // 只保留域名+端口部分,防止携带多余路径 const baseUrl = `${referer.protocol}//${referer.host}`; if (ALLOWED_REDIRECTS.includes(baseUrl)) { req.session.redirectTarget = baseUrl; } } next(); } ] }, // 其余配置不变... };
- 修改
callback函数读取Session:
callback: (req, res) => { const finalRedirect = req.session.redirectTarget || ALLOWED_REDIRECTS[0]; // 清除session中的临时数据 delete req.session.redirectTarget; res.redirect(finalRedirect); }
这样就不用在Angular应用的跳转链接里加参数了,更加简洁安全。
内容的提问来源于stack exchange,提问作者Rahul Singh
相关产品推荐
相关产品推荐

