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

node-oidc-provider v6中offline_access scope缺失及consent提示添加问题

解决node-oidc-provider v6中offline_access scope的同意提示问题

要让offline_access scope正常出现在授权响应中,且通过consent流程让用户明确授权,不需要修改库源码,按以下步骤调整你的代码:

1. 确保Provider配置中包含offline_access scope

首先在初始化Provider时,把offline_access加入允许的scopes列表:

const provider = new Provider('你的OIDC域名', {
  scopes: ['openid', 'profile', 'email', 'offline_access'], // 包含offline_access
  // 其他配置项...
});

2. 在Consent页面渲染时展示offline_access给用户选择

在渲染consent页面的逻辑中,先获取交互详情,把请求的scopes(包括offline_access)展示给用户,让用户选择是否授权:

// 示例:获取交互详情并传递给页面模板
const details = await oidc.interactionDetails(req, res);
const requestedScopes = details.params.scope.split(' '); // 拆分请求的所有scopes

// 把requestedScopes传给前端模板,让用户勾选同意的scopes,比如:
res.render('consent', {
  client: details.client,
  requestedScopes,
  // 其他页面需要的数据...
});

3. 修改Consent端点逻辑,根据用户选择处理offline_access

调整你现有的consent处理代码,根据用户提交的选择来决定是否保留offline_access scope:

case 'consent': {
  // 1. 获取交互详情,拿到请求的所有scopes
  const details = await oidc.interactionDetails(req, res);
  const requestedScopes = details.params.scope.split(' ');

  // 2. 从前端提交的参数中拿到用户同意的scopes(假设前端用allowedScopes字段传递)
  const allowedScopes = req.body.allowedScopes || [];

  // 3. 计算被拒绝的scopes:请求的scopes中未被用户勾选的
  const rejectedScopes = requestedScopes.filter(scope => !allowedScopes.includes(scope));

  const consent = {
    rejectedScopes,
    rejectedClaims: [],
    replace: false,
  };

  return oidc.interactionFinished(
    req,
    res,
    { consent },
    {
      mergeWithLastSubmission: true,
    }
  );
}

这样调整后,当用户在consent页面勾选了offline_access,这个scope就会被保留在授权响应中,不需要修改库的源码。之前你删除的第55行代码逻辑是:如果offline_access未经过用户明确同意,就自动移除它——通过上面的流程让用户明确授权,就能触发该逻辑保留这个scope。

内容的提问来源于stack exchange,提问作者Konstantin Zelinsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:22:49