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
相关产品推荐
相关产品推荐

