You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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临时存储:

  1. 在配置文件的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();
      }
    ]
  },
  // 其余配置不变...
};
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:34:35