AWS Cognito对接OIDC IdP生成令牌时自定义Scope问题咨询
AWS Cognito 对接外部OIDC身份提供商自定义Scope及令牌流转问题解答
以下是基于实际落地经验的对应解答:
1. 是否支持通过Cognito向外部IdP发起令牌请求时传入自定义scope
支持,属于Cognito原生能力,不需要二次开发。
- 配置路径:进入Cognito用户池控制台,找到「联合身份提供商」菜单下你接入的对应OIDC IdP配置页,找到「授权请求范围」配置项,把需要透传给外部IdP的自定义scope按空格分隔填入即可,Cognito发起授权跳转时会自动把这些scope拼接到发给IdP的authorize请求参数中。
- 踩坑提醒:不要只在IdP配置页加scope,同步要在对应应用客户端的「允许OAuth范围」配置里加上这些自定义scope,不然Cognito侧的授权校验会先拦截请求,根本到不了外部IdP;另外外部IdP侧也要提前给Cognito注册的对应客户端开通这些scope的访问权限,不然IdP会直接返回
invalid_scope错误。
2. 若支持传自定义scope,如何把外部IdP返回的access token传递到自有服务端
有两种成熟落地方案,按需选择即可:
- 方案一:属性映射透传。在IdP属性映射配置里,把外部IdP令牌返回的
access_token字段,映射到Cognito用户池的自定义用户属性(比如提前创建custom:idp_access_token属性),同时把这个属性设置为令牌可读,后续Cognito签发的ID Token会把这个属性放在claims里,服务端直接解析ID Token就能拿到。 - 方案二:令牌端点直接透传。在对应应用客户端的OAuth配置里开启「IdP令牌透传」开关,Cognito在自己的
/oauth2/token端点返回响应时,会额外增加idp_access_token字段,原样返回外部IdP签发的access token,客户端拿到后直接传给服务端即可。 - 补充:如果外部IdP的access token有效期较短,可以配合Cognito预令牌生成的Lambda触发器,在用户刷新Cognito会话时同步刷新外部IdP的access token,避免拿到过期令牌调用接口失败。
3. 若不支持上述能力,是否可跳过Cognito换令牌流程,自行拿authorization code向IdP换access token
技术上能实现,但非常不推荐。
- 注意:首先要明确,Cognito托管认证流程回调时带的authorization code是Cognito自己签发的,只能用于调用Cognito的
/oauth2/token端点换取Cognito自身的令牌,不能直接拿这个code去外部IdP换令牌。 - 如果一定要走自换令牌的逻辑,相当于要完全绕开Cognito的托管认证UI:你需要自己实现前端到外部IdP的授权跳转,拿到IdP返回的authorization code后,由服务端自行向IdP发起换令牌请求、拉取用户信息,再调用Cognito的开发者认证接口把用户信息同步到Cognito用户池,最后签发Cognito的会话令牌。这种模式下Cognito只承担纯用户目录的作用,托管联合认证的内置能力基本全废,后续维护成本极高,除非有强定制需求否则不要选择。
4. 令牌获取流程中是否支持向终端用户展示授权同意弹窗
支持,分两层控制逻辑:
- 外部IdP侧的同意弹窗:只要在Cognito发往IdP的授权请求里带上
prompt=consent参数就行,这个参数可以在IdP配置里设为固定传参,也可以前端发起授权跳转时拼接到URL参数里,符合OIDC规范的IdP收到这个参数后会强制弹出授权同意页,让用户确认你申请的所有scope权限。 - Cognito侧的同意弹窗:如果需要在Cognito层再做一次权限确认,可以在应用客户端配置里开启「用户授权同意」开关,用户在外部IdP完成认证回跳Cognito后,Cognito会先展示自身的权限授权页,用户确认同意后才会签发Cognito的会话令牌。
内容的提问来源于stack exchange,提问作者Ankush Jindal
相关产品推荐
相关产品推荐

